《C++ vector 完全指南:vector的模拟实现》
《C++ vector 完全指南:vector的模拟实现》
文章目录
- 《C++ vector 完全指南:vector的模拟实现》
- 一、定义vector的成员变量
- 二、用vector实现动态二维数组
- 三、vector的接口实现
- 1.vector的默认成员函数
-
- (1)构造函数实现
- (2)析构函数实现
- (3)拷贝构造函数
- (4)赋值运算符重载
- 2.vector的迭代器实现
- 3.vector的容量操作函数
- 4.vector的访问操作函数
- 5.vector的修改操作函数
- 整体源代码介绍
-
- vector.h
- Test.cpp
一、定义vector的成员变量
vector的成员变量是三个迭代器,也可以说是三个指针。


二、用vector实现动态二维数组


三、vector的接口实现
1.vector的默认成员函数
(1)构造函数实现
我们就依次实现下面四种构造方式





(2)析构函数实现
这里要注意对_start判空,因为空的时候就不用再析构!

(3)拷贝构造函数
这里也可以是构造函数,也是拷贝构造函数!

(4)赋值运算符重载
这里直接选择swap交换函数就OK

2.vector的迭代器实现
vector中迭代器iterator就是一个指针。所以我们直接使用typedef实现即可
begin()和end()本质上都是指针

3.vector的容量操作函数
size()、capacity()、clear()、empty()都很简单!一看就懂!

reverse()和string实现差不多,只要新容量大于旧容量就发生扩容!



4.vector的访问操作函数
这里面主要就是 数组的下表访问[ ]

5.vector的修改操作函数
这里面有:push_back 、 pop_back 、 insert 、 earse
push_back要考虑扩容的问题,前两个比较简单



整体源代码介绍
vector.h
代码如下(示例):
#pragma once#include#include#includenamespace bit{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector(){}// C++11 前置生成默认构造vector() = default;vector(const vector<T>& v){reserve(v.size());for (auto& e : v){push_back(e);}}// 类模板的成员函数,还可以继续是函数模版template <class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}vector(size_t n, const T& val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}vector(int n, const T& val = T()){reserve(n);for (int i = 0; i < n; i++){push_back(val);}}void clear(){_finish = _start;}// v1 = v3//vector& operator=(const vector& v)//{//if (this != &v)//{//clear();//reserve(v.size());//for (auto& e : v)//{//push_back(e);//}//}//return *this;//}void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}// v1 = v3//vector& operator=(vector v)vector<T>& operator=(vector<T> v){swap(v);return *this;}~vector(){if (_start){delete[] _start;_start = _finish = _end_of_storage = nullptr;}}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}void reserve(size_t n){if (n > capacity()){size_t old_size = size();T* tmp = new T[n];//memcpy(tmp, _start, old_size * sizeof(T));for (size_t i = 0; i < old_size; i++){tmp[i] = _start[i];}delete[] _start;_start = tmp;_finish = tmp + old_size;_end_of_storage = tmp + n;}}void resize(size_t n, T val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish < _start + n){*_finish = val;++_finish;}}}size_t size() const{return _finish - _start;}size_t capacity() const{return _end_of_storage - _start;}bool empty() const{return _start == _finish;}void push_back(const T& x){// 扩容if (_finish == _end_of_storage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;}void pop_back(){assert(!empty());--_finish;}iterator insert(iterator pos, const T& x){assert(pos >= _start);assert(pos <= _finish);// 扩容if (_finish == _end_of_storage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;return pos;}void erase(iterator pos){assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it != end()){*(it - 1) = *it;++it;}--_finish;}T& operator[](size_t i){assert(i < size());return _start[i];}const T& operator[](size_t i) const{assert(i < size());return _start[i];}private:iterator _start = nullptr;iterator _finish = nullptr;iterator _end_of_storage = nullptr;};/*void print_vector(const vector& v){vector::const_iterator it = v.begin();while (it != v.end()){cout << *it << \" \";++it;}cout << endl;for (auto e : v){cout << e << \" \";}cout << endl;}*/template<class T>void print_vector(const vector<T>& v){// 规定,没有实例化的类模板里面取东西,编译器不能区分这里const_iterator// 是类型还是静态成员变量//typename vector::const_iterator it = v.begin();auto it = v.begin();while (it != v.end()){cout << *it << \" \";++it;}cout << endl;for (auto e : v){cout << e << \" \";}cout << endl;}template<class Container>void print_container(const Container& v){/*auto it = v.begin();while (it != v.end()){cout << *it << \" \";++it;}cout << endl;*/for (auto e : v){cout << e << \" \";}cout << endl;}void test_vector1(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (size_t i = 0; i < v.size(); i++){cout << v[i] << \" \";}cout << endl;vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << \" \";++it;}cout << endl;for (auto e : v){cout << e << \" \";}cout << endl;print_vector(v);vector<double> vd;vd.push_back(1.1);vd.push_back(2.1);vd.push_back(3.1);vd.push_back(4.1);vd.push_back(5.1);print_vector(vd);}void test_vector2(){std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);print_container(v);/*v.insert(v.begin() + 2, 30);print_vector(v);*/int x;cin >> x;auto p = find(v.begin(), v.end(), x);if (p != v.end()){// insert以后p就是失效,不要直接访问,要访问就要更新这个失效的迭代器的值/*v.insert(p, 20);(*p) *= 10;*/p = v.insert(p, 40);(*(p + 1)) *= 10;}print_container(v);}void test_vector3(){std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);print_container(v);// 删除所有的偶数auto it = v.begin();while (it != v.end()){if (*it % 2 == 0){it = v.erase(it);}else{++it;}}print_container(v);}void test_vector4(){int i = int();int j = int(1);int k(2);vector<int> v;v.resize(10, 1);v.reserve(20);print_container(v);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(15, 2);print_container(v);v.resize(25, 3);print_container(v);v.resize(5);print_container(v);}void test_vector5(){vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);print_container(v1);vector<int> v2 = v1;print_container(v2);vector<int> v3;v3.push_back(10);v3.push_back(20);v3.push_back(30);v1 = v3;print_container(v1);print_container(v3);}void test_vector6(){vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(4);v1.push_back(4);vector<int> v2(v1.begin(), v1.begin() + 3);print_container(v1);print_container(v2);list<int> lt;lt.push_back(10);lt.push_back(10);lt.push_back(10);lt.push_back(10);vector<int> v3(lt.begin(), lt.end());print_container(lt);print_container(v2);vector<string> v4(10, \"1111111\");print_container(v4);vector<int> v5(10);print_container(v5);vector<int> v6(10u, 1);print_container(v6);vector<int> v7(10, 1);print_container(v7);}void test_vector7(){vector<string> v;v.push_back(\"11111111111111111111\");v.push_back(\"11111111111111111111\");v.push_back(\"11111111111111111111\");v.push_back(\"11111111111111111111\");print_container(v);v.push_back(\"11111111111111111111\");print_container(v);}}
Test.cpp
代码如下(示例):
#include#includeusing namespace std;#include\"vector.h\"void test_vector1(){vector<int> v1;vector<int> v2(10, 1);vector<int> v3(++v2.begin(), --v2.end());for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << \" \";}cout << endl;vector<int>::iterator it = v3.begin();while (it != v3.end()){cout << *it << \" \";++it;}cout << endl;for (auto e : v3){cout << e << \" \";}cout << endl;}void TestVectorExpand(){size_t sz;vector<int> v;v.reserve(100);sz = v.capacity();cout << \"capacity changed: \" << sz << \'\\n\';cout << \"making v grow:\\n\";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << \"capacity changed: \" << sz << \'\\n\';}}}void test_vector2(){//TestVectorExpand();vector<int> v(10, 1);v.reserve(20);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(15);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(5);cout << v.size() << endl;cout << v.capacity() << endl;}void test_vector3(){//TestVectorExpand();vector<int> v(10, 1);v.reserve(20);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(15, 2);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(25, 3);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(5);cout << v.size() << endl;cout << v.capacity() << endl;}void test_vector4(){vector<int> v(10, 1);v.push_back(2);v.insert(v.begin(), 0);for (auto e : v){cout << e << \" \";}cout << endl;v.insert(v.begin() + 3, 10);for (auto e : v){cout << e << \" \";}cout << endl;vector<int> v1(5, 0);for (size_t i = 0; i < 5; i++){cin >> v1[i];}for (auto e : v1){cout << e << \",\";}cout << endl;vector<char> v2;string s2;// \\0vector<int> v3;// send(s2.c_str())}void test_vector5(){vector<int> v(5, 1);vector<vector<int>> vv(10, v);vv[2][1] = 2;// vv.operator[](2).operator[](1) = 2;for (size_t i = 0; i < vv.size(); i++){for (size_t j = 0; j < vv[i].size(); ++j){cout << vv[i][j] << \" \";}cout << endl;}cout << endl;}int main(){test_vector5();}//template//class vector//{//T& operator[](int i)//{//assert(i < _size);////return _a[i];//}//private://T* _a;//size_t _size;//size_t _capacity;//};// vector//class vector//{//int& operator[](int i)//{//assert(i < _size);////return _a[i];//}//private://int* _a;//size_t _size;//size_t _capacity;//};////// vector<vector>//class vector//{//vector& operator[](int i)//{//assert(i < _size);////return _a[i];//}//private://vector* _a;//size_t _size;//size_t _capacity;//};//int main()//{//bit::test_vector7();////return 0;//}//using namespace std;//#include//void Test1()//{//vector v = { 1,2,3,4,5,6,7,8 };//vector::iterator it = v.begin();//cout << \"顺序遍历:\";//while (it != v.end())//{//cout << *it << \" \";//++it;//}//cout << endl;//cout << \"逆序遍历:\";//vector::reverse_iterator rit = v.rbegin();//while (rit != v.rend())//{//cout << *rit << \" \";//++rit;//}//}//void Test2()//{////1.默认构造函数初始化//vector v1;////2.n个val初始化//vector v2(3, 2);//string s(\"abcd\");////3.利用迭代器区间初始化//vector v3(s.begin(), s.end());////4.拷贝构造//vector v4(v3);////5.赋值重载//v2 = v3;////6.可变参数列表初始化//vector v5 = { 1,2,3,4,5 };////vector v6 = v4;//error 不同类型不能赋值//}//void Test3()//{//vector v = { 1,2,3,4,5 };//cout << v.size() << endl;//cout << v.capacity() << endl;//}//void TestExpand()//{//size_t sz;//vector v;//sz = v.capacity();//cout << \"making v grow:\" << endl;//for (int i = 0; i < 100; ++i)//{//v.push_back(i);//if (sz != v.capacity())//{//sz = v.capacity();//cout << \"capacity changed: \" << sz << endl;//}//}//}//void Test4()//{//vector v1 = { 1,2,3,4,5 };//cout << \"v1的有效长度为:\" << v1.size() << endl;//cout << \"v1的容量大小为:\" << v1.capacity() << endl;//v1.reserve(10);//cout << \"v1的有效长度为:\" << v1.size() << endl;//cout << \"v1的容量大小为:\" << v1.capacity() << endl;//v1.resize(8, 10);//for (auto& e : v1)//{//cout << e << \" \";//}//}//// error////因为reserve只是改变了容量capacity并没有改变size,////而operator[]访问时元素时是禁止访问下标size以后的元素的,一旦访问就会直接报错//void Test5()//{//vector v;//v.reserve(10);//for (int i = 0; i < 10; i++)//{//v[i] = i;//}//for (auto& e : v)//{//cout << e << \" \";//}//}//void Test6()//{//vector v = { 1,2,3,4,5 };//for (int i = 0; i < v.size(); i++)//{//cout << v[i] << \" \";//}//cout << endl;//cout << \"front:\" << v.front() << endl;//cout << \"back:\" << v.back() << endl;//}//void Test7()//{//vector v = { 1,2,3,4,5,6 };//cout << \"back:\" << v.back() << endl;////尾插//v.push_back(7);////尾删//cout << \"back:\" << v.back() << endl;//v.pop_back();//cout << \"back:\" << v.back() << endl;//vector vv = { 6,5,4,3,2,1 };////n个val赋值给原数组//vv.assign(3, 2);//for (int i = 0; i < vv.size(); i++)//{//cout << vv[i] << \" \";//}//cout << endl;//vv.swap(v);//for (int i = 0; i < v.size(); i++)//{//cout << v[i] << \" \";//}//cout << endl;//for (int i = 0; i < vv.size(); i++)//{//cout << vv[i] << \" \";//}//}//void Test8()//{//vector myvector(3, 100);//vector::iterator it = myvector.begin();////1.向指定位置插入一个元素//it = myvector.insert(it, 200);//cout << \"myvector contains:\";//for (it = myvector.begin(); it < myvector.end(); it++)//cout << \' \' << *it;//cout << endl;////2.向指定位置插入n个元素//myvector.insert(it, 2, 300);//cout << \"myvector contains:\";//for (it = myvector.begin(); it < myvector.end(); it++)//cout << \' \' << *it;//cout << endl;////3.向指定位置插入一段迭代器区间//it = myvector.begin();//vector anothervector(2, 400);//cout << \"myvector contains:\";//for (it = myvector.begin(); it < myvector.end(); it++)//cout << \' \' << *it;//cout << endl;//it = myvector.begin();//myvector.insert(it + 2, anothervector.begin(), anothervector.end());////4.向指定位置插入一段迭代器区间//int myarray[] = { 501,502,503 };//myvector.insert(myvector.begin(), myarray, myarray + 3);//cout << \"myvector contains:\";//for (it = myvector.begin(); it < myvector.end(); it++)//cout << \' \' << *it;//cout << endl;//}//void Test9()//{////1.删除迭代器所指元素//vector myvector;//for (int i = 1; i <= 10; i++)//myvector.push_back(i);//vector::iterator it = myvector.erase(myvector.begin() + 5);//it = myvector.erase(it);////2.删除一段迭代器区间//it = myvector.erase(myvector.begin(), myvector.begin() + 3);//cout << \"myvector contains:\";//for (int i = 0; i < myvector.size(); ++i)//cout << \' \' << myvector[i];//cout << endl;//}////int main()////{//////Test3();//////TestExpand();//////Test4();//////Test5();//////Test6();//////Test7();//////Test8();////Test9();////}////int main()//{//vector v{ 1,2,3,4,5,6 };//auto it = v.begin();//v.assign(100, 8);//while (it != v.end())//{//cout << *it << \" \";//++it;//}//cout << endl;//return 0;//}


