C++STLのvectorのカスタム実装

4510 ワード

C++STLのvectorのカスタム実装
2018.10.15-今までC++開発の職場を探していましたが、卒業したばかりで、仕事の経験とプロジェクトの経験がなく、仕事はずっと探しにくいです.チャットの中である友达はあなたがSTLを自分で実现して、ブログの上で置いて、简単に自分のプロジェクトとしています.そこでこのブログを書きました.
用語が適切でない場合や間違っている場合は、私に連絡して修正してください.
注意点:1、本明細書のようにクラステンプレートtemplate(汎用)を使用して実装される場合、クラスの実装とクラスの宣言は同じファイルに格納されます.そうしないと、include「xxx.h」になっても、コンパイル時に「解析できない外部記号」が提示されます.2、vectorコンテナ自体はinsertとeraseに関連しているため、付与操作は欠かせない.このブログは実現時に複雑なデータ型を考慮していない.すなわち、簡単なchar、doubleなどの基本データ型のみをサポートする.class、structなどの複雑なデータ型をサポートするコードを実現するために、ブログを単独で送信する機会があります.3、これまでカスタムコンテナの一般的な機能、例えばresize()、reserve()、erase()とinsert()の重荷が実現されており、後で検討すると更新される.4、テストコードはしばらく与えられず、実際にはvectorコンテナと同じ使い方をしていますが、反復器(iterator)はサポートされていないはずです.begin()やend()などの関数の戻り値は慎重に使用してください.5、本開発環境VS 2013.
クラスMyVectorの宣言
template
class MyVector{
public:
	MyVector();
	~MyVector();
	
	int size();
	int capacity();
	void clear();
	bool empty();
	void swap(MyVector& v);
	T at(int index);
	void push_back(T v);
	void pop_back();
	
	void two();				//     

	T* begin();
	T* end();
	T front();

	T* erase(T* pos);//         ,          
	//T* erase(T* start,T* end);//         ,  end       

	T* insert(T* pos, T val);//  val     
	void insert(T* pos, int count, T val);// pos    count val
private:
	T* data;	 //        
	int Size;	 //    
	int Capacity;//     

};

クラステンプレートMyVectorの外部実装構造と分析
template
MyVector::MyVector(){
	Size = 0;
	Capacity = 10;
	data = new T[Capacity];
}
template
MyVector::~MyVector(){

}

size()、capacity()、empty()、clear()の実装
template
int MyVector::size(){
	return this->Size;
}
template
int MyVector::capacity(){
	return this->Capacity;
}
template
bool MyVector::empty(){
	return (Size == 0);
}
template
void MyVector::clear(){
	while (!empty())
		pop_back();
}



at()、push_back()、pop_back()の実装
template
T MyVector::at(int index){
	if (empty() || index > Capacity)//      
		return (T)NULL;
	return data[index];
}
template
void MyVector::push_back(T v){
	//two();
	data[Size++] = v;
}
template
void MyVector::pop_back(){
	if (empty())//     
		return;
		//throw runtime_error("empty");
	//data[Size - 1] = (T*)NULL;
	--Size;
}

容器自己成長two()、swap()の実現
template
void MyVector::two(){
	if (size() > capacity()){
		Capacity *= 2;
		T* old = this->data;
		data = new T[Capacity];
		for (int i = 0; i < Size; ++i)
			data[i] = old[i];
		delete[]old;
	}
}
template
void MyVector::swap(MyVector& v){
	//           
	int len = size();
	T* tmp = new T[len];//         tmp 
	for (int i = 0; i < len; ++i){
		tmp[i] = at(i);
	}
	clear();
	for (int i = 0; i < v.size(); ++i){
		push_back(v.at(i));
	}
	v.clear();
	for (int i = 0; i < len; ++i)
		v.push_back(tmp[i]);
}

front()、begin()、end()の実装
template
T MyVector::front(){
	if (!empty()){
		return data[0];
	}
	else
		return (T)NULL;
}
template
T* MyVector::begin(){
	if (!empty()) 
		return data;
	else
		return (T*)NULL;
}
template
T* MyVector::end(){
	if (!empty())
		return data + Size;
	else{
		cout << " " << endl;
		return (T*)NULL;
	}
}

Insert()、erase()の実装
template
T* MyVector::erase(T* pos){//
	T* p=pos;
	T* tmp = pos + 1;
	while (tmp != end()){
		*pos = *tmp;
		++pos;
		++tmp;
	}
	--Size;
	return p;
}

template
T* MyVector::insert(T* pos, T val){
	if (Size + 1 > Capacity)
		two();//     ,   
	T* p = end();
	int i = 0;
	for (i = Size; p != pos; --i, --p){
		data[i] = data[i - 1];
	}
	data[i] = val;
	++Size;
	return pos;
}
//       bug, Capacity      ,   “  ”
template
void MyVector::insert(T* pos, int count, T val){
	Size += count;
	while (size() > capacity()){
		two();//     ,   
		cout << size() << " " << capacity() << endl;
	}
	T* p = (T*)NULL;
	int i = 0,j=0;
	for (i = size() - 1; data[i]!=*(pos-1); --i){
		data[i+count] = data[i];
	}
	for (p = pos; p < pos +count; ++p)
		*p = val;
}