编程学习笔记之vector学习心得

纹枰老妖

发布日期: 2021-01-20 09:20:55 浏览量: 180
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、vector介绍

在c++中,vector是一个可以存储各种类型对象的集合容器,可以把它看成一种能够动态【吃胖】或【减肥】的数组。vector是一个类模板,使用【vector<T>】格式可以生成一个模板类,考虑到vector容器所应具备的一些特征,vector应该设计成不管传递给vector的模板参数是什么数据类型或类类型,一个vector生成的模板类,其内存大小应该是不变的。为验证我的想法,我在我的机器上测验了一下,使用【sizeof(A)】获得的内存大小为16,其中A为我的一个自定义类类型,不管我把A制造成多大,得到的结果总是 =16,然后我用高大上的开发工具vs13智能显示了一下vector模板类里面的数据成员,发现一共有4个,它们分别是:_Myfirst、_Myend、_Mylast和忘了怎么拼写的“myblabla。。。”,如果我没猜错的话,以上四种类型应该是三个指针和一个整型,它们所代表的意思分别是起始位置、终点位置、当前位置以及当前vector类所占据的内存大小。

值得一提的是,vector是一种线性顺序式集合容器,虽然它可以动态分配存储空间,但它所占用的内存,是一块连续存储的内存。看到这里也许您有点迷惑,既然是动态分配了,为何还会像静态变量那样使用连续存储内存呢?让我先从设计初衷解释一下,首先前辈们在制造vector时,希望它具有数组一样的高效率,当我们通过下标访问vector中的某个元素时,可以直接用指针偏移量的方式寻址访问,而不要像链表那样弄个循环找到那个位置。其次再从内存分配机制这个角度阐述一下,为求容易理解,我使用例子吧:比如我们用vector生成一个int类容器A,那么机器首先为这个A在堆中开辟了一个大小为100的连续内存区域【其中100是我随便举得例子,A本身的内存是16,A相当于一个标签,贴在一个容器上面,这个容器现在的大小是100】,并把这块区域当成是A的对应容器,然后程序运行到某个位置时,需要往容器里面添加一个元素,但程序发现A容器已经饱和,一旦添加了这个元素,A现在对应的容器会容纳不下,怎么办呢?程序会重新向堆中申请一块更大的连续内存,比如200的大小。如果有,则把原先的100连续内存中的元素逐个拷贝到新内存区域中去,最后在拷贝完成之后,销毁原先的100内存。这个过程是比较麻烦点,但好歹达到了目的——访问方便。

vector支持很多操作,向尾部添加元素可以用【push_back(T);】,其中T为模板参数的引用;在尾部销毁元素可以用【pop_back()】;在某个位置插入元素可以用【insert(n,T)】,其中n代表位置,T是模板参数的引用;判断容器是否为空可以用【empty()】,如果容器为空,此表达式会返回true,否则返回false;清空容器用clear()等。除此之外,vector还定义了很多操作符重载,比如【!=】、【==】等。

二、vector的使用

要在程序中使用vector,首先我们要包含它所在的库【#include <vector>】,并且还要做好相应的using说明【using std::vector;】,但为了写代码方便,我的说明一向都写成这样【using namespace std;】。做好以上工作后,我们就可以在自己的代码中使用vector生成模板类了。

接下来说说vector生成模板类最常见的四种初始化情况,比如下面4个重载构造函数:

  1. // 创建一个int类型的vector容器,但这个容器是空的
  2. vector<int> vi;
  3. // 创建一个int类型的vector容器,该容器暂有10个int元素,每个元素被赋初始值0
  4. vector<int> vi2(10);
  5. // 创建一个int类型的vector容器,该容器暂有5个int元素,每个元素被赋值99
  6. vector<int> vi3(5,99);
  7. // 创建一个int类型vector容器,该容器拷贝了vi2,既该容器具有10个值为0的元素
  8. vector<int> vi4(vi2);

说了这么多,下面让我们写一个简单小程序来巩固一下,该程序使用vector生成一个int型容器,然后由我们自己随便给容器添加若干个元素,接着程序负责求出这些元素的平均值以及找出最大值,最后程序把求出的平均值插入到容器中间,再对容器内所有的元素按照递增顺序排列,代码如下:

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm> //调用sort排序函数必须包含的头文件
  4. using namespace std;
  5. int main()
  6. {
  7. int value = 0, average = 0, max = 0, num = 0;
  8. vector<int>vi;
  9. while (cin >> value) vi.push_back(value); //利用循环向容器插入数值元素
  10. cout << "现在容器内所有元素是:";
  11. for (vector<int>::size_type vinum = 0; vinum != vi.size(); vinum++) //使用size_type声明一个变量,并用这个变量当作vi的下标
  12. cout << vi[vinum]<<" ";
  13. value = 0;
  14. for (vector<int>::const_iterator i = vi.begin(); i != vi.end(); i++) //这次换个方式遍历,i是vector容器的指针
  15. {
  16. value += *i;
  17. num++;
  18. *i > max ? (max = *i) : 0;
  19. }
  20. cout << value << endl;
  21. average = value / num;
  22. cout << "容器内平均值是" << average << "\n最大值是" << max << endl;
  23. for (num = 0; num != vi.size(); num++);
  24. num /= 2;
  25. vi.insert(vi.begin() + num, 1, average); //在这里我们把平均值插入到容器中间
  26. sort(vi.begin(), vi.end()); //在这里我们对容器内所有元素进行排序
  27. cout << "经过处理,容器内元素被处理成如下排列:";
  28. for (vector<int>::const_iterator i = vi.begin(); i != vi.end(); i++) //最后我们输出经过处理的容器内所有元素
  29. cout << " " << *i;
  30. cout << endl;
  31. return 0;
  32. }
上传的附件

发送私信

5
文章数
4
评论数
最近文章
eject