当前位置:   article > 正文

C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用

C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用

string(上):C++初阶学习第六弹——探索STL奥秘(一)——标准库中的string类-CSDN博客

string(下):C++初阶学习第七弹——探索STL奥秘(二)——string的模拟实现-CSDN博客

前言:

在前面我们已经学习了string的使用和模拟实现,它们在使用上有异曲同工之妙,所以在学习了string之后我们再学习vector就会容易很多,下面跟着我的脚步我们来学习一下vector的具体用法

目录

一、vector的基本概念

二、vector的使用

2.1 vector在库中的存在方式及常见接口

2.2 vector的构造

2.3 vector迭代器的使用

2.4 vector的空间增长问题

2.5 vector的增删查改

三、总结


一、vector的基本概念

vector和string一样,都是属于C++模板库中的部分:

Vector,中文名称为“向量”,是C++ STL(Standard Template Library,标准模板库)中的一种数据结构,它是一个动态数组,可以动态地增加或减少其大小。vector在内存中是连续存储的,这意味着它的所有元素都存储在内存中相邻的位置。

基本概念:

vector是一个模板类,定义在头文件(include<vector>)中。可以使用vector来存储任意类型的对象,包括自定义类型。

vector有以下几个重要的特点:

  1. 可动态增长:vector可以动态地增加其大小,无需重新分配内存。
  2. 可动态缩小:vector可以动态地缩小其大小,释放不需要的内存。
  3. 支持随机访问:vector支持随机访问,这意味着可以通过下标快速访问vector的元素。
  4. 支持插入和删除:vector支持在头或尾插入和删除元素,但在中间插入和删除元素的效率较低。

二、vector的使用

接下来我们就来学习一下vector的基本使用方法,由于之前我们已经有了string的学习基础,所以在下面我们会讲的较为快速一些,主要就讲一下vector的几个比较常用的用法,我们的重心还是放在后面vector的模拟实现上

2.1 vector在库中的存在方式及常见接口

我们先来看一下vector在库中的存在形式

这其中涉及到类模板和容器的问题,这些目前我们还没有学到,等我们后面学到了再讲

vector由于是一个容器,它支持不同类型的数据进行操作,所以这个写法上与string还是有不少区别,如vector在定义一个变量时的方式为:

  1. vector<int> v1;
  2. vector<double> v2;
  3. vector<string> v3;

我们先来看一下vector的一些比较重要的接口函数:

下面我们就先来讲一下几个比较重要的接口函数

2.2 vector的构造

vector的构造方式上与string并没有太大区别,主要也是无参的默认构造,初始化构造,拷贝构造等,没有太大的难度,下面的讲解会直接给出代码实例

代码实例如下:

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. // 1、测试vector的几种构造方法
  5. void test1_vector()
  6. {
  7. vector<int>(); //这种的会发生隐式类型转换,但只在本行起作用
  8. vector<int> v1; //无参构造
  9. vector<int> v2(10, 100); //构造一个vector有10个100
  10. vector<int> v3(v2); //拷贝构造
  11. vector<int> v4(v2.begin(), v2.end()); //迭代器构造
  12. //下面还有一种迭代器构造的方式,这里涉及了迭代器的初始化,我们在下面会讲
  13. int arr[] = { 16,2,77,29 };
  14. vector<int> v5(arr, arr + sizeof(arr) / sizeof(int));
  15. cout << "The contents of v5 are:";
  16. for (vector<int>::iterator it = v5.begin(); it != v5.end(); ++it)
  17. cout << ' ' << *it;
  18. cout << '\n';
  19. }
  20. int main()
  21. {
  22. test1_vector();
  23. return 0;
  24. }

运行结果:

2.3 vector迭代器的使用

这里的使用与string类似,我们往下看:

代码实例:

  1. void test2_vector()
  2. {
  3. vector<int> v1;
  4. v1.push_back(1);
  5. v1.push_back(2);
  6. v1.push_back(3);
  7. v1.push_back(4);
  8. //正向迭代器1
  9. vector<int>::iterator it = v1.begin();
  10. while (it != v1.end())
  11. {
  12. cout << *it << " ";
  13. ++it;
  14. }
  15. cout << endl;
  16. //正向迭代器2
  17. for (auto e : v1) //for循环的本质其实就是迭代器,而且它还会自己++
  18. {
  19. cout << e << " ";
  20. }
  21. cout << endl;
  22. //反向迭代器
  23. vector<int>::reverse_iterator rt = v1.rbegin();
  24. while (rt != v1.rend())
  25. {
  26. cout << *rt << " ";
  27. rt++;
  28. }
  29. cout << endl;
  30. }

运行结果:

正反向迭代器在vector中的应用是很好理解的

2.4 vector的空间增长问题

注意事项:
1、vector在不同环境下的默认扩容速度是不同的,一般是1.5倍或者2倍

2、reverse只负责开辟空间,一般在知道需要多少空间的时候可以调用该函数,省去了扩容的麻烦

3、resize不仅可以扩容,还可以进行初始化来改变size

上面的这些重点就是resize和reverse两项,我们先把这两个单拎出来看一下:

resize有两个参数,一个是开辟空间大小,一个是初始化大小

reverse只有一个参数,就是开辟空间大小

代码示例:

  1. void test3_vector()
  2. {
  3. vector<int> v1;
  4. v1.reserve(100); //开辟一个100大小的空间
  5. cout << v1.capacity() << endl;
  6. vector<int> v2;
  7. v2.resize(10); //开辟一个10个大小的空间,同时改变size,并通过半缺省来初始化
  8. for (auto e : v2)
  9. {
  10. cout << e << " ";
  11. }
  12. cout << endl;
  13. vector<int> v3;
  14. v3.resize(10, 3); //将数据初始化为3
  15. for (auto e : v3)
  16. {
  17. cout << e << " ";
  18. }
  19. cout << endl;
  20. }

运行结果:

2.5 vector的增删查改

这些全部通过接口函数来实现,难度不大

代码实例:

  1. void test4_vector()
  2. {
  3. vector<int> v1;
  4. //增——push_back(尾插)
  5. v1.push_back(1);
  6. v1.push_back(2);
  7. v1.push_back(3);
  8. v1.push_back(4);
  9. cout << "增:";
  10. for (auto e : v1)
  11. {
  12. cout << e << " ";
  13. }
  14. cout << endl;
  15. //删——pop_back(尾删)
  16. v1.pop_back();
  17. cout << "删:";
  18. for (auto e : v1)
  19. {
  20. cout << e << " ";
  21. }
  22. cout << endl;
  23. //查——find(这个是算法库中的接口,不是vector的接口,返回类型是查找位置的迭代器)
  24. auto pos1 = find(v1.begin(), v1.end(), 2);
  25. cout << "查:";
  26. cout << *pos1 << endl; //如果没找到就不进行任何操作
  27. //在任意位置插入——insert
  28. //要先用find找到要插入的位置,然后再插入数据
  29. auto pos2 = find(v1.begin(), v1.end(), 2);
  30. if (pos2 != v1.end())
  31. {
  32. v1.insert(pos2, 20);
  33. }
  34. cout << "插入任意位置:";
  35. for (auto e : v1)
  36. {
  37. cout << e << " ";
  38. }
  39. cout << endl;
  40. //在任意位置删除——erase
  41. //同样要先用find找到要删除的位置,然后再删除数据
  42. auto pos3 = find(v1.begin(), v1.end(), 2);
  43. v1.erase(pos3);
  44. cout << "删除任意位置:";
  45. for (auto e : v1)
  46. {
  47. cout << e << " ";
  48. }
  49. cout << endl;
  50. //改——operator[]
  51. v1[0] = 100;
  52. cout << "改:";
  53. for (auto e : v1)
  54. {
  55. cout << e << " ";
  56. }
  57. cout << endl;
  58. }

运行结果:

三、总结

以上就是vector的用法讲解,相比于string,vector的使用范围其实更广,vector的难点在于其模拟实现上,这个我们后面就讲

感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/608405
推荐阅读
相关标签
  

闽ICP备14008679号