0


STL容器入门基础Ⅰvector

STL是C++标准库的重要组成部分,vector容器在实际中非常的重要,它常见的接口使用我们都要熟悉,这一篇肝一波vector容器常见的接口使用,帮助大家深入理解

vector容器的接口使用

vector容器的初始化

  1. //构造函数初始化
  2. void test_vector1()
  3. {
  4. //存储int
  5. vector<int>v1;
  6. v1.push_back(1);
  7. v1.push_back(2);
  8. //存储double
  9. vector<double>v2;
  10. v2.push_back(1.1);
  11. v2.push_back(2.2);
  12. //存储string
  13. vector<string>v3;
  14. v3.push_back("李白");//
  15. v3.push_back("杜甫");
  16. v3.push_back("苏轼");
  17. //用10个5初始化
  18. vector<int>v4(10,5);
  19. }

vector容器的遍历方法

  1. //vector容器的遍历
  2. void test_vector2()
  3. {
  4. vector<int>v1;
  5. v1.push_back(1);
  6. v1.push_back(2);
  7. v1.push_back(3);
  8. v1.push_back(4);
  9. //1.下标+[]
  10. for (size_t i = 0; i < v1.size(); ++i)
  11. {
  12. cout << v1[i] << " ";//打印1 2 3 4
  13. }
  14. cout << endl;
  15. //2.迭代器
  16. vector<int>::iterator it = v1.begin();
  17. while (it != v1.end())
  18. {
  19. cout << *it <<" ";//打印1 2 3 4
  20. ++it;
  21. }
  22. cout << endl;
  23. //3.范围for
  24. for (auto e : v1)
  25. {
  26. cout << e << " ";//打印1 2 3 4
  27. }
  28. cout << endl;
  29. }

vector容器的空间增长问题

  1. //测试增容 vs下
  2. void test_vector3()
  3. {
  4. size_t sz;
  5. vector<int> v;
  6. v.reserve(100);//提前开辟空间 可以减少扩容
  7. sz = v.capacity();//初始容量
  8. cout << "making v grow:\n";
  9. for (int i = 0; i < 100; ++i)
  10. {
  11. v.push_back(i);
  12. if (sz != v.capacity())
  13. {
  14. sz = v.capacity();
  15. cout << "capacity changed: " << sz << '\n';//扩容1.5倍
  16. }
  17. }
  18. //vector<int> v1;
  19. //v1.resize(100, 1);// resize扩容同时初始化
  20. v.resize(10);
  21. cout << v.size() << endl;//打印10 resize扩容 不会缩容
  22. cout << v.capacity()<<endl;//打印100
  23. }

vector容器指定位置插入删除

  1. //指定位置插入 删除
  2. //使用迭代器 不支持下标
  3. void test_vector4()
  4. {
  5. vector<int>v1;
  6. v1.push_back(1);
  7. v1.push_back(2);
  8. v1.push_back(3);
  9. v1.push_back(4);
  10. //头插1个0
  11. v1.insert(v1.begin(), 0);
  12. for (auto e : v1)
  13. {
  14. cout << e << " ";//打印0 1 2 3 4
  15. }
  16. cout << endl;
  17. //第三个位置插入2
  18. v1.insert(v1.begin() + 3, 2);
  19. for (auto e : v1)
  20. {
  21. cout << e << " ";//打印0 1 2 2 3 4
  22. }
  23. cout << endl;
  24. //头删三次
  25. v1.erase(v1.begin());
  26. v1.erase(v1.begin());
  27. v1.erase(v1.begin());
  28. for (auto e : v1)
  29. {
  30. cout << e << " ";//打印2 3 4
  31. }
  32. cout << endl;
  33. }

vector容器的查找

  1. //要复用find查找函数
  2. void test_vector5()
  3. {
  4. vector<int>v1;
  5. v1.push_back(1);
  6. v1.push_back(2);
  7. v1.push_back(3);
  8. v1.push_back(4);
  9. //查找3删除
  10. auto pos=find(v1.begin(), v1.end(), 3);
  11. if (pos != v1.end())
  12. {
  13. cout << "找到了" << endl;
  14. v1.erase(pos);//删除3
  15. }
  16. else
  17. {
  18. cout << "没有找到" << endl;
  19. }
  20. //遍历
  21. for (auto e : v1)
  22. {
  23. cout << e << " ";
  24. }
  25. cout << endl;
  26. }

vector容器数据的排序

  1. //调用sort排序
  2. //随机访问迭代器
  3. void test_vector6()
  4. {
  5. vector<int>v1;
  6. v1.push_back(1);
  7. v1.push_back(3);
  8. v1.push_back(9);
  9. v1.push_back(7);
  10. v1.push_back(10);
  11. sort(v1.begin(), v1.end());//默认升序
  12. //sort(v1.begin(), v1.end(),greater<int>());//使用仿函数排降序
  13. for (auto e : v1)
  14. {
  15. cout << e << " ";//1 3 7 9 10
  16. }
  17. cout << endl;
  18. }

vector容器的模拟实现

模拟实现vector容器可以帮助我们更好的理解底层是如何实现的

模拟实现函数的接口

  1. template<class T>
  2. class vector
  3. {
  4. public:
  5. typedef T* iterator;
  6. typedef const T* const_iterator;
  7. //无参的构造
  8. vector()
  9. :_start(nullptr)
  10. , _finish(nullptr)
  11. , _endofstorage(nullptr)
  12. {}
  13. //带参构造 现代写法 迭代器区间
  14. template <class InputIterator>
  15. vector(InputIterator first, InputIterator last)
  16. :_start(nullptr)
  17. , _finish(nullptr)
  18. , _endofstorage(nullptr)
  19. {
  20. while (first != last)
  21. {
  22. push_back(*first);
  23. ++first;
  24. }
  25. }
  26. //交换函数
  27. void swap(vector<T>& v)
  28. {
  29. std::swap(_start, v._start);
  30. std::swap(_finish, v._finish);
  31. std::swap(_endofstorage, v._endofstorage);
  32. }
  33. //拷贝构造现代写法 复用带参构造
  34. vector(const vector<T>& v)
  35. :_start(nullptr)
  36. , _finish(nullptr)
  37. , _endofstorage(nullptr)
  38. {
  39. vector<T> tmp(v.begin(), v.end());
  40. this->swap(tmp);
  41. cout << "调用拷贝构造" << endl;
  42. }
  43. //赋值
  44. vector<T>& operator=(vector<T> v)
  45. {
  46. cout << "调用赋值" << endl;
  47. this->swap(v);
  48. return *this;
  49. }
  50. //析构
  51. ~vector()
  52. {
  53. if (_start)
  54. {
  55. delete[]_start;
  56. _start = _finish = _endofstorage = nullptr;
  57. }
  58. }
  59. //大小
  60. size_t size()const
  61. {
  62. return _finish - _start;
  63. }
  64. //容量
  65. size_t capacity()const
  66. {
  67. return _endofstorage - _start;
  68. }
  69. //迭代器
  70. iterator begin()
  71. {
  72. return _start;
  73. }
  74. const_iterator begin()const
  75. {
  76. return _start;
  77. }
  78. iterator end()
  79. {
  80. return _finish;
  81. }
  82. const_iterator end()const
  83. {
  84. return _finish;
  85. }
  86. //扩容函数
  87. void reserve(size_t n)
  88. {
  89. size_t sz = size();
  90. if (n > capacity())
  91. {
  92. T* tmp = new T[n];//先开辟新空间
  93. if (_start)//有空间才拷贝
  94. {
  95. //memcpy(tmp, _start, size() * sizeof(T));//拷贝数据
  96. for (size_t i = 0; i < size(); ++i)
  97. {
  98. tmp[i] = _start[i];
  99. }
  100. delete[]_start;//释放旧空间
  101. }
  102. _start = tmp;//在指向新空间
  103. }
  104. //同时让finish和capacity都指向新空间
  105. _finish = _start + sz;
  106. _endofstorage = _start + n;
  107. }
  108. //扩容加初始化 注意分情况
  109. void resize(size_t n, const T& val = T())
  110. {
  111. if (n > capacity())
  112. {
  113. reserve(n);
  114. }
  115. if (n > size())
  116. {
  117. while (_finish < _start + n)
  118. {
  119. *_finish = val;
  120. ++_finish;
  121. }
  122. }
  123. else
  124. {
  125. _finish = _start + n;
  126. }
  127. }
  128. //尾部插入数据
  129. void push_back(const T& x)
  130. {
  131. if (_finish == _endofstorage)
  132. {
  133. size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;
  134. reserve(newcapacity);
  135. }
  136. *_finish = x;//插入到finish位置
  137. ++_finish;//更新大小
  138. }
  139. //尾删数据
  140. void pop_back()
  141. {
  142. if (_finish > _start)
  143. {
  144. --_finish;
  145. }
  146. }
  147. //返回数据
  148. T& operator[](size_t pos)
  149. {
  150. assert(pos < size());
  151. return _start[pos];
  152. }
  153. const T& operator[](size_t pos)const
  154. {
  155. assert(pos < size());
  156. return _start[pos];
  157. }
  158. //pos位置插入x
  159. iterator insert(iterator pos, const T& x)
  160. {
  161. assert(pos >= _start && pos <= _finish);
  162. //先扩容
  163. if (_finish == _endofstorage)
  164. {
  165. size_t n = pos - _start;//扩容后pos失效,要更新
  166. size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;
  167. reserve(newcapacity);
  168. pos = _start + n;
  169. }
  170. //挪动数据
  171. iterator end = _finish - 1;
  172. while (end >= pos)
  173. {
  174. *(end + 1) = *end;
  175. --end;
  176. }
  177. *pos = x;
  178. ++_finish;
  179. return pos;
  180. }
  181. //erase
  182. iterator erase(iterator pos)
  183. {
  184. assert(pos >= _start && pos < _finish);
  185. iterator it = pos + 1;
  186. while (it != _finish)
  187. {
  188. *(it - 1) = *it;
  189. ++it;//...
  190. }
  191. --_finish;
  192. return pos;//指向最后被删除元素的后一个位置
  193. }
  194. void clear()
  195. {
  196. _finish = _start;
  197. }
  198. private:
  199. iterator _start;
  200. iterator _finish;
  201. iterator _endofstorage;
  202. };

模拟实现的测试

测试要和上面模拟接口放到一个命名空间里面

  1. //尾插 尾删测试
  2. void Test_vector1()
  3. {
  4. vector<int>v;
  5. v.push_back(1);
  6. v.push_back(2);
  7. v.push_back(3);
  8. v.push_back(4);
  9. v.push_back(5);
  10. v.insert(v.begin(), 0);//头部插入0
  11. v.pop_back();//删除两个
  12. v.pop_back();
  13. vector<int>::iterator it = v.begin();
  14. while (it != v.end())
  15. {
  16. cout << *it << " ";//打印0 1 2 3
  17. ++it;
  18. }
  19. cout << endl;
  20. }
  21. //指定位置插入测试
  22. void Test_vector2()
  23. {
  24. vector<int>v;
  25. v.push_back(1);
  26. v.push_back(2);
  27. v.push_back(3);
  28. v.push_back(4);
  29. //指定位置偶数前插入20
  30. vector<int>::iterator it = v.begin();
  31. while (it != v.end())
  32. {
  33. if (*it % 2 == 0)
  34. {
  35. //要考虑迭代器失效
  36. it = v.insert(it, 20);
  37. ++it;
  38. }
  39. ++it;
  40. }
  41. for (auto e : v)
  42. {
  43. cout << e << " ";
  44. }
  45. cout << endl;
  46. }
  47. //指定位置删除
  48. void Test_vector3()
  49. {
  50. vector<int>v;
  51. v.push_back(1);
  52. v.push_back(2);
  53. v.push_back(3);
  54. v.push_back(4);
  55. v.push_back(5);
  56. v.push_back(2);
  57. //删除偶数
  58. vector<int>::iterator it = v.begin();
  59. while (it != v.end())
  60. {
  61. if (*it % 2 == 0)
  62. {
  63. it = v.erase(it);
  64. }
  65. else
  66. {
  67. ++it;
  68. }
  69. }
  70. for (auto e : v)
  71. {
  72. cout << e << " ";//打印1 3 5
  73. }
  74. cout << endl;
  75. }
  76. //迭代器区间初始化
  77. void Test_vector4()
  78. {
  79. vector<int>v;
  80. v.push_back(1);
  81. v.push_back(2);
  82. v.push_back(3);
  83. v.push_back(4);
  84. //迭代器模板
  85. vector<int>v1(v.begin(), v.end());
  86. std::string s("hello");
  87. vector<char>v2(s.begin(), s.end());
  88. for (auto e : v1)
  89. {
  90. cout << e << " ";//打印1 2 3 4
  91. }
  92. cout << endl;
  93. for (auto e : v2)
  94. {
  95. cout << e << "";//打印 hello
  96. }
  97. cout << endl;
  98. }
  99. //拷贝构造和赋值测试
  100. void Test_vector5()
  101. {
  102. vector<int>v;
  103. v.push_back(1);
  104. v.push_back(2);
  105. v.push_back(3);
  106. v.push_back(4);
  107. //迭代器区间
  108. vector<int>v1(v.begin(), v.end());
  109. for (auto e : v1)
  110. {
  111. cout << e << " ";
  112. }
  113. cout << endl;
  114. vector<int>v3(v);//调用构造
  115. for (auto e : v3)
  116. {
  117. cout << e << " ";
  118. }
  119. cout << endl;
  120. }

学习vector一定要学会查看文档,这里放一个官方文档链接vector容器文档,vector在实际中非常的重要,我们只要熟悉常见的接口就可以

希望这篇文章大家有所收获,我们下篇见


本文转载自: https://blog.csdn.net/qq_72486849/article/details/125947593
版权归原作者 小圣编程 所有, 如有侵权,请联系我们删除。

“STL容器入门基础Ⅰvector”的评论:

还没有评论