#ifndef VECTOR_H
#define VECTOR_H
#include<process.h>
#include<iostream>
using namespace std;
template<class T>
class Vector{
public:
typedef T* iterator;
typedef T& reference;
// コンストラクタ
Vector(int vsize=0, const T& v=T() ){
array_size = vsize;
current_size = vsize;
array = new T[array_size+1]; //end()が指すiteratorを作るため1を追加する。
for( int i = 0 ; i < vsize ; i++ )
array[i] = v;
}
// コピーコンストラクタ
Vector( const Vector& src ){
array_size = src.array_size;
current_size = src.current_size;
array = new T[array_size+1];
for( int i = 0 ; i < current_size ; i++ )
array[i] = src.array[i];
}
// コンストラクタ
Vector( iterator itr_first, iterator itr_last ){
array_size = itr_last - itr_first;
currentSize = array_size;
array = new T[array_size+1];
for( int i = 0 ; i < current_size ; i++, itr_first++ )
array[i] = *itr_first;
}
// デストラクタ
~Vector(){
delete [] array;
}
iterator begin(){ return array; }
iterator end(){ return array+current_size; }
int size(){ return current_size; }
int capacity(){ return array_size; }
bool empty() const{ return current_size==0; }
// at関数はoperator[]と異なり、チェックつき
reference at(int index){
if( size() <= index ){
cerr << "error" << endl;
exit(1);
}
return array[index];
}
reference front(){ return array[0]; }
reference back(){ return array[current_size-1]; }
void push_back(const T &x);
void pop_back();
iterator erase(iterator itr);
iterator erase(iterator first,iterator last);
void clear(){
erase( begin(), end() );
}
//添え字演算子関数
reference operator[](int index){ return array[index];}
private:
void resize(int size);
iterator array;
int current_size;
int array_size;
};
template<class T> void Vector<T>::push_back(const T &x){
if(current_size >= array_size)
resize( size() + 10 );
array[current_size+1] = array[current_size];
array[current_size] = x;
current_size++;
}
template<class T> void Vector<T>::pop_back(){
array[current_size] = array[current_size+1];
current_size--;
}
template<class T> Vector<T>::iterator Vector<T>::erase(iterator itr){
iterator next, tmp;
iterator return_itr = itr; //消去した次のiteratorを返すため現在位置を取得
while( itr != end() ){
tmp = itr++;
next = itr;
*tmp = *next;
}
current_size--;
return return_itr;
}
//
// 効率の悪いerase
template<class T> Vector<T>::iterator Vector<T>::erase(iterator first, iterator last){
iterator itr = begin();
for( ; itr != first && itr != end() ; itr++ );
while( itr != last && itr != end() )
erase( itr );
resize( current_size+10 );
return itr;
}
// 配列の大きさをcurrent_size+1に変える
template<class T> void Vector<T>::resize(int size){
iterator tmp = new T[size+1];
iterator tmp2 = tmp;
iterator itr = begin();
for( ; itr != end() ; itr++ )
*tmp = *itr;
delete [] array;
array = tmp2;
array_size = size;
}
#endif
#include<iostream>
#include<string>
#include "Vector.h"
#include<algorithm>
using namespace std;
void disp( Vector<int>* p ){
for( int i = 0 ; i < p->size() ; i++ )
cout << p->at(i) << " ";
cout << endl;
}
void main(){
int i;
Vector<int> v;
// 逆順に格納する
for( i = 9 ; i >= 0 ; i-- )
v.push_back( i );
// 表示
cout << "v ";
disp( &v );
// コピーコンストラクタ
Vector<int> v2(v);
cout << "v2 ";
disp( &v2 );
// v2のキャパシティーとサイズ
cout << "v2のキャパシティー=" << v2.capacity() << " v2のサイズ=" << v2.size() << endl;
// v2を削除
v2.erase( v2.begin(), v2.end() );
// v2のキャパシティーとサイズ
cout << "v2のキャパシティー=" << v2.capacity() << " v2のサイズ=" << v2.size() << endl;
// vをソート
sort( v.begin(), v.end() );
// vを表示
disp( &v );
}