编程学习笔记之c++相关::vector学习心得

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):vector<int> vi;  //创建一个int类型的vector容器,但这个容器是空的。

2):vector<int> vi2(10);  //创建一个int类型的vector容器,该容器暂有10个int元素,每个元素被赋初始值0。

3):vector<int> vi3(5,99);  //创建一个int类型的vector容器,该容器暂有5个int元素,每个元素被赋值99。

4):vector<int> vi4(vi2);  //创建一个int类型vector容器,该容器拷贝了vi2,既该容器具有10个值为0的元素。

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

#include <iostream>
#include <vector>
#include <algorithm> //调用sort排序函数必须包含的头文件
using namespace std;

int main()
{
	int value = 0, average = 0, max = 0, num = 0;
	vector<int>vi;
	
	while (cin >> value)  vi.push_back(value); //利用循环向容器插入数值元素

	cout << "现在容器内所有元素是:";
	for (vector<int>::size_type vinum = 0; vinum != vi.size(); vinum++) //使用size_type声明一个变量,并用这个变量当作vi的下标
		cout << vi[vinum]<<" ";

	value = 0;
	for (vector<int>::const_iterator i = vi.begin(); i != vi.end(); i++) //这次换个方式遍历,i是vector容器的指针
	{
		value += *i;
		num++;
		*i > max ? (max = *i) : 0;
	}
	cout << value << endl;
	average = value / num;
	cout << "容器内平均值是" << average << "\n最大值是" << max << endl;

	for (num = 0; num != vi.size(); num++);
	num /= 2;

	vi.insert(vi.begin() + num, 1, average);  //在这里我们把平均值插入到容器中间
    sort(vi.begin(), vi.end());  //在这里我们对容器内所有元素进行排序
	
	cout << "经过处理,容器内元素被处理成如下排列:";
	for (vector<int>::const_iterator i = vi.begin(); i != vi.end(); i++) //最后我们输出经过处理的容器内所有元素
		cout << " " << *i;
	cout << endl;
	return 0;
}

运行结果如图:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值