1 vector基本概念

功能:

  • vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:

  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

image.png

  • vector容器的迭代器是支持随机访问的迭代器

2 vector构造函数

功能描述:

  • 创建vector容器

函数原型:

  • vector<T> v; //采用模板实现类实现,默认构造函数
  • vector(v.begin(), v.end()); //将v[begin(), end())区间中的元素拷贝给本身。
  • vector(n, elem); //构造函数将n个elem拷贝给本身。
  • vector(const vector &vec); //拷贝构造函数。

示例:

  1. #include <vector>
  2. void printVector(vector<int>& v) {
  3. for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
  4. cout << *it << " ";
  5. }
  6. cout << endl;
  7. }
  8. void test01()
  9. {
  10. vector<int> v1; //无参构造
  11. for (int i = 0; i < 10; i++)
  12. {
  13. v1.push_back(i);
  14. }
  15. printVector(v1);
  16. vector<int> v2(v1.begin(), v1.end());
  17. printVector(v2);
  18. vector<int> v3(10, 100);
  19. printVector(v3);
  20. vector<int> v4(v3);
  21. printVector(v4);
  22. }
  23. int main() {
  24. test01();
  25. system("pause");
  26. return 0;
  27. }

总结:vector的多种构造方式没有可比性,灵活使用即可

3 vector赋值操作

功能描述:

  • 给vector容器进行赋值

函数原型:

  • vector& operator=(const vector &vec);//重载等号操作符
  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
  • assign(n, elem); //将n个elem拷贝赋值给本身。

示例:

  1. #include <vector>
  2. void printVector(vector<int>& v) {
  3. for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
  4. cout << *it << " ";
  5. }
  6. cout << endl;
  7. }
  8. //赋值操作
  9. void test01()
  10. {
  11. vector<int> v1; //无参构造
  12. for (int i = 0; i < 10; i++)
  13. {
  14. v1.push_back(i);
  15. }
  16. printVector(v1);
  17. vector<int>v2;
  18. v2 = v1;
  19. printVector(v2);
  20. vector<int>v3;
  21. v3.assign(v1.begin(), v1.end());
  22. printVector(v3);
  23. vector<int>v4;
  24. v4.assign(10, 100);
  25. printVector(v4);
  26. }
  27. int main() {
  28. test01();
  29. system("pause");
  30. return 0;
  31. }

总结: vector赋值方式比较简单,使用operator=,或者assign都可以

4 vector容量和大小

功能描述:

  • 对vector容器的容量和大小操作

函数原型:

  • empty(); //断容器是否为空
  • capacity(); //容器的容量
  • size(); //返回容器中元素的个数
  • resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除。
  • resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除

示例:

  1. #include <vector>
  2. void printVector(vector<int>& v) {
  3. for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
  4. cout << *it << " ";
  5. }
  6. cout << endl;
  7. }
  8. void test01()
  9. {
  10. vector<int> v1;
  11. for (int i = 0; i < 10; i++)
  12. {
  13. v1.push_back(i);
  14. }
  15. printVector(v1);
  16. if (v1.empty())
  17. {
  18. cout << "v1为空" << endl;
  19. }
  20. else
  21. {
  22. cout << "v1不为空" << endl;
  23. cout << "v1的容量 = " << v1.capacity() << endl;
  24. cout << "v1的大小 = " << v1.size() << endl;
  25. }
  26. //resize 重新指定大小 ,若指定的更大,默认用0填充新位置,可以利用重载版本替换默认填充
  27. v1.resize(15,10);
  28. printVector(v1);
  29. //resize 重新指定大小 ,若指定的更小,超出部分元素被删除
  30. v1.resize(5);
  31. printVector(v1);
  32. }
  33. int main() {
  34. test01();
  35. system("pause");
  36. return 0;
  37. }

总结:

  • 判断是否为空 —- empty
  • 返回元素个数 —- size
  • 返回容器容量 —- capacity
  • 重新指定大小 —- resize

5 vector插入和删除

功能描述:

  • 对vector容器进行插入、删除操作

函数原型:

  • push_back(ele); //尾部插入元素ele
  • pop_back(); //删除最后一个元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
  • clear(); //删除容器中所有元素

示例:

  1. #include <vector>
  2. void printVector(vector<int>& v) {
  3. for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
  4. cout << *it << " ";
  5. }
  6. cout << endl;
  7. }
  8. //插入和删除
  9. void test01()
  10. {
  11. vector<int> v1;
  12. //尾插
  13. v1.push_back(10);
  14. v1.push_back(20);
  15. v1.push_back(30);
  16. v1.push_back(40);
  17. v1.push_back(50);
  18. printVector(v1);
  19. //尾删
  20. v1.pop_back();
  21. printVector(v1);
  22. //插入
  23. v1.insert(v1.begin(), 100);
  24. printVector(v1);
  25. v1.insert(v1.begin(), 2, 1000);
  26. printVector(v1);
  27. //删除
  28. v1.erase(v1.begin());
  29. printVector(v1);
  30. //清空
  31. v1.erase(v1.begin(), v1.end());
  32. v1.clear();
  33. printVector(v1);
  34. }
  35. int main() {
  36. test01();
  37. system("pause");
  38. return 0;
  39. }

总结:

  • 尾插 —- push_back
  • 尾删 —- pop_back
  • 插入 —- insert (位置迭代器)
  • 删除 —- erase (位置迭代器)
  • 清空 —- clear

6 vector数据存取

功能描述:

  • 对vector中的数据的存取操作

函数原型:

  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

示例:

  1. #include <vector>
  2. void test01()
  3. {
  4. vector<int>v1;
  5. for (int i = 0; i < 10; i++)
  6. {
  7. v1.push_back(i);
  8. }
  9. for (int i = 0; i < v1.size(); i++)
  10. {
  11. cout << v1[i] << " ";
  12. }
  13. cout << endl;
  14. for (int i = 0; i < v1.size(); i++)
  15. {
  16. cout << v1.at(i) << " ";
  17. }
  18. cout << endl;
  19. cout << "v1的第一个元素为: " << v1.front() << endl;
  20. cout << "v1的最后一个元素为: " << v1.back() << endl;
  21. }
  22. int main() {
  23. test01();
  24. system("pause");
  25. return 0;
  26. }

总结:

  • 除了用迭代器获取vector容器中元素,[ ]和at也可以
  • front返回容器第一个元素
  • back返回容器最后一个元素

7 vector互换容器

功能描述:

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec); // 将vec与本身的元素互换

示例:

  1. #include <vector>
  2. void printVector(vector<int>& v) {
  3. for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
  4. cout << *it << " ";
  5. }
  6. cout << endl;
  7. }
  8. void test01()
  9. {
  10. vector<int>v1;
  11. for (int i = 0; i < 10; i++)
  12. {
  13. v1.push_back(i);
  14. }
  15. printVector(v1);
  16. vector<int>v2;
  17. for (int i = 10; i > 0; i--)
  18. {
  19. v2.push_back(i);
  20. }
  21. printVector(v2);
  22. //互换容器
  23. cout << "互换后" << endl;
  24. v1.swap(v2);
  25. printVector(v1);
  26. printVector(v2);
  27. }
  28. void test02()
  29. {
  30. vector<int> v;
  31. for (int i = 0; i < 100000; i++) {
  32. v.push_back(i);
  33. }
  34. cout << "v的容量为:" << v.capacity() << endl;
  35. cout << "v的大小为:" << v.size() << endl;
  36. v.resize(3);
  37. cout << "v的容量为:" << v.capacity() << endl;
  38. cout << "v的大小为:" << v.size() << endl;
  39. //收缩内存
  40. vector<int>(v).swap(v); //匿名对象
  41. cout << "v的容量为:" << v.capacity() << endl;
  42. cout << "v的大小为:" << v.size() << endl;
  43. }
  44. int main() {
  45. test01();
  46. test02();
  47. system("pause");
  48. return 0;
  49. }

总结:swap可以使两个容器互换,可以达到实用的收缩内存效果

8 vector预留空间

功能描述:

  • 减少vector在动态扩展容量时的扩展次数

函数原型:

  • reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

示例:

  1. #include <vector>
  2. void test01()
  3. {
  4. vector<int> v;
  5. //预留空间
  6. v.reserve(100000);
  7. int num = 0;
  8. int* p = NULL;
  9. for (int i = 0; i < 100000; i++) {
  10. v.push_back(i);
  11. if (p != &v[0]) {
  12. p = &v[0];
  13. num++;
  14. }
  15. }
  16. cout << "num:" << num << endl;
  17. }
  18. int main() {
  19. test01();
  20. system("pause");
  21. return 0;
  22. }

总结:如果数据量较大,可以一开始利用reserve预留空间