C++ STL标准模板库——vector

本文详细介绍了C++ STL中的vector容器,包括其基本概念、数据结构、动态扩展机制及迭代器特性。深入探讨了vector的各种操作,如构造、赋值、容量调整、插入删除、数据存取以及预留空间的方法,并提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ STL标准模板库——vector

vector基本概念

vector的数据结构和数值非常相似,也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩展。

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

vector容器的迭代器是支持随机访问的迭代器。即 v.begin()+i 迭代器可以这样访问


#include<vector> 使用时要加头文件

void myprintf(vector<int> &v)
{
	for (vector<int>::iterator it = v.begin(); it < v.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

vector构造函数

函数原型:

  • vector v;             //默认构造函数
  • vector(v.begin(),v.end());    //将v.begin()和v.end()区间的元素拷贝给本身
  • vector(n,elem);        //构造函数将n个elem元素拷贝给本身
  • vector(const vector & vec);   //拷贝构造函数

例子:

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	
	vector<int> v1(v);
	
	vector<int> v2(v.begin(), v.end());
	
	vector<int> v3(6,10);

vector 赋值操作

有两种方式:操作符= 和 assign()

  • assign(v.begin(),v.end());   //将区间[v.begin(),v.end()]的数据拷贝给本身
  • assign(n,elem);     //将n个elem元素拷贝给本身

例子:

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	
	vector<int> v1;
	v1 = v;
	
	vector<int> v2;
	v2.assign(v1.begin(),v1.end());
	
	vector<int> v3;
	v3.assign(6,9);
	

vector容量和大小

函数原型:

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

例子:

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	
	v.resize(7,9);
	
	if (v.empty())
	{
		cout << "v为空" << endl;
	}
	else
	{
		cout << "V的容量为:" << v.capacity() << endl;
		cout << "V的大小为:" << v.size() << endl;
	}

vector插入和删除

函数原型:

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

例子:

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	myprintf(v);

	v.pop_back();
	
	v.pop_back();
	
	v.insert(v.end(),9);

	v.insert(v.end(),3, 8);

	v.erase(v.begin());

	v.erase(v.end()-1);

	v.erase(v.begin(),v.end());

	v.clear();

vector数据的存取

有两种方式:操作符= 和 .at()

  • front();      //返回容器中第一个元素
  • back();      //返回容器中最后一个元素

例子:

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	for (vector<int>::iterator it = v.begin(); it < v.end(); it++)
	{
		cout << *it << "  ";
	}
	
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << "  ";
		cout << v.at(i) << "  ";
	}
	cout << endl;
	cout << v.front() << "  ";
	cout << v.back() << "  ";

vector互换容器

实现两个容器间的元素互换
函数原型:

  • swap(vec);      //将vec与本身元素互换
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	
	vector<int> v1;
	for (int i = 10; i > 5; i--)
	{
		v1.push_back(i);
	}
	
	cout << "交换后" << endl;
	v.swap(v1);//V和V1交换数值
	myprintf(v);
	myprintf(v1);

vector预留空间

作用:减少vector在动态扩容时的扩展次数

函数原型;

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

例子:

让num记录容器扩容的次数,如果没有v.reserve(1000);这句代码,容器扩容18次,即num=18;如果有v.reserve(1000);这句代码,容器扩容1次,即num=1,即一步到位


	int num = 0;
	int * d = NULL;
	vector<int> v;
	v.reserve(1000);
	for (int i = 0; i < 1000; i++)
	{
		v.push_back(i);
		if (d!=&v[0])
		{
			d = &v[0];
			num++;
		}
	}
	cout << num << endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值