ToB企服应用市场:ToB评测及商务社交产业平台

标题: STL之vector [打印本页]

作者: 十念    时间: 2024-9-22 16:49
标题: STL之vector
vector简朴先容

vector的构造函数

vector本质是类模板,可以存储任何类型的数据。数组在声明前需要加上数据类型,而vector则通过模板参量设定类型。比如,声明一个int型的vector数组。
  1. vector<int> arr1;                                                                //一个空数组
  2. vector<int> arr2 {1, 2, 3, 4, 5};                                //包含1、2、3、4、5五个变量
  3. vector<int> arr3(4);                                                        //开辟4个空间,值默认为0
  4. vector<int> arr4(5, 3);                                                        //5个值为3的数组
  5. vector<int> arr5(arr4);                                                        //将arr4的所有值复制进去,和arr4一样
  6. vector<int> arr6(arr4.begin(), arr4.end());                //将arr4的值从头开始到尾复制
  7. vector<int> arr7(arr4.rbegin(), arr4.rend());        //将arr4的值从尾到头复
复制代码
也就是说想要创建一个vector可以通过
vector的容量

这里紧张先容其中的resize和reserve。
vector的容量包括:size,capacity,empty,resize和reserve。

reserve紧张是用来预留空间在已知需要多少空间的情况下制止不必要的扩容
  1. void resize(size_type n, value_type val = value_type());
  2. - 如果n<当前容器的size,则将元素减少到前n个,移除多余的元素(并销毁)
  3. - 如果n>当前容器的size,则在容器中追加元素,如果val指定了,则追加的元素为val的拷贝,否则,默认初始化
  4. - 如果n>当前容器容量,内存会自动重新分配
  5. void reserve(size_type n)
  6. - 如果n>容器的当前capacity,该函数会使得容器重新分配内存使capacity达到n
  7. - 任何其他情况,该函数调用不会导致内存重新分配,并且容器的capacity不会改变
  8. - 该函数不会影响向量的size而且不会改变任何元素
复制代码
resize是改变size并且创建对象
  1. 1、resize(n)
  2.         调整容器的长度大小,使其能容纳n个元素。
  3.        
  4.         如果n小于容器的当前的size,则删除多出来的元素。
  5.        
  6.         否则,添加采用值初始化的元素。
  7. 2、 resize(n,t)
  8.         多一个参数t,将所有新添加的元素初始化为t。
复制代码
vector的元素访问以及遍历

  1. for (auto num : arr)
  2. {
  3.         cout << num << endl;
  4. }
复制代码
3.迭代器访问

  1. //迭代器:vector<int>::iterator
  2. for (vector<int>::iterator it = arr.begin(); it != arr.end(); it++)
  3. {
  4.     cout << *it << endl;
  5. }
  6. //迭代器:vector<int>::reverse_iterator
  7. for (vector<int>::reverse_iterator it = arr.rbegin(); it != arr.rend(); it++)
  8. {
  9.     cout << *it << endl;
  10. }
复制代码
vector使用时的注意事项

1.迭代器失效

vector的每一次扩容都不是在原地扩容,而是新开辟一块儿空间后将原先的数据拷贝到新空间
当我们使用insert()插入新的元素时
  1. vector<int> arr;
  2. arr.push_back(1);
  3. arr.push_back(2);
  4. arr.push_back(3);
  5. arr.push_back(4);
  6. arr.push_back(5);
  7. auto pos = find(arr.begin(),arr.end(),3);
  8. arr.insert(pos,30);
  9. arr.insert(pos,40);
复制代码
此时就会出现问题

在使用erase()时也会有问题
  1. vector<int> v;
  2. v.push_back(1);
  3. v.push_back(2);
  4. v.push_back(3);
  5. v.push_back(4);
  6. v.push_back(4);
  7. v.push_back(6);
  8. for (auto e : v)
  9. {
  10.         cout << e << " ";
  11. }
  12. cout << endl;
  13. auto it = v.begin();
  14. while (it != v.end())
  15. {
  16.         if (*it % 2 == 0)
  17.         {
  18.                 it = v.erase(it);
  19.         }
  20.         ++it;
  21. }
  22. for (auto e : v)
  23. {
  24.         cout << e << " ";
  25. }
  26. cout << endl;
复制代码
这段代码想要删除全部的偶数
可是在使用erase()时它返回的是被删除元素的下一个位置的迭代器
那么解决方法也很简朴
在pos位置使用一次insert后
不要再次直接访问pos迭代器
一定要更新了pos之后再去访问!
删除后不用再++迭代器
只用在没删除的时候再++
2深浅拷贝问题

拷贝vector时不要使用memcpy这是一种浅拷贝即只是拷贝了相同的数据并没有开辟新的空间浅拷贝是按字节拷贝,会导致拷贝后迭代器指向同一块空间。
对于insert来说`**
在pos位置使用一次insert后
不要再次直接访问pos迭代器
一定要更新了pos之后再去访问!
删除后不用再++迭代器
只用在没删除的时候再++

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4