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の宣言
クラステンプレートMyVectorの外部実装構造と分析
size()、capacity()、empty()、clear()の実装
at()、push_back()、pop_back()の実装
容器自己成長two()、swap()の実現
front()、begin()、end()の実装
Insert()、erase()の実装
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;
}