面向对象程序设计(C++)之 vector(初阶)

1. vector 的构造

vector 需要显式实例化类模版,在创建 vector 类型的容器时可以直接创建,也可以进行初始化,例如 v2 ,也可以使用迭代器的方式创建,具体关于更多vector的知识: vector

//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);
//迭代器初始化
vector<int> v3(v2.begin(), v2.end());

2. vector 的遍历

vector 与 string 类有着异曲同工之妙,并且做了更多的优化,所以在学习了 string 类之后再来学习 vector 就会简单很多,关于 vector 的遍历也与 string 类很相似,具体介绍可以移步到 面向对象程序设计(C++)之 string 类

2.1 下标遍历


	//模版类只能显式实例化
	vector<int> v1;
	vector<int> v2(10, 1);
	//迭代器初始化
	vector<int> v3(v2.begin(), v2.end());
	//1.下标遍历
	for (size_t i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << " ";
	}
	cout << endl;
	

2.2 迭代器遍历


	//模版类只能显式实例化
	vector<int> v1;
	vector<int> v2(10, 1);
	//迭代器初始化
	vector<int> v3(v2.begin(), v2.end());
	//2.迭代器遍历
	vector<int>::iterator it = v2.begin();
	while (it != v2.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	

2.3 范围 for 遍历 


	//模版类只能显式实例化
	vector<int> v1;
	vector<int> v2(10, 1);
	//迭代器初始化
	vector<int> v3(v2.begin(), v2.end());
	//3.范围 for 遍历
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

3. vector 的扩容机制

这里借助插入100个数据来判断 vector 的扩容机制,我们由下图可知在 VS 环境下是1.5倍扩容,在 g++ 环境下是2倍扩容,当然我们可以使用 reserve 接口来提前保存一部分空间减少扩容次数,需要注意的是 vector 与 string 不同,string 的 reverse 接口如果给出的值小于原来的容量那么就是一个无约束的,可能会缩容;但是 vector 的 reverse 接口如果给出一个小于原容量的值就不会影响,即不会缩容(VS 与 g++ 环境均不会缩容)

void TestVectorExpend()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	cout << "capacity changed :" << sz << "\n";
	cout << "make a grow" << endl;
	for (size_t i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed :" << sz << "\n";
		}
	}
}

VS 环境下扩容

g++环境下扩容 

 

4. vector 的常用接口 

4.1 resize 接口 

resize 接口是在原来 vector 对象的基础上进行添加数据,当然有两种情况,一种是给定的添加数据容量小于原来的size,就会减小size的值而不改变capacity的值(容量不变);第二种情况就是大于size的值,就会根据给定的值来扩容(这里只讨论VS环境下的情况)

vector<int> v(10, 1);
cout << v.size() << endl;
cout << v.capacity() << endl;
//1.小于size
v.resize(5, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;

//2.大于size
v.resize(15, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;

4.2 push_back 接口

可以进行尾插,通常 vector 支持迭代器插入

vector<int> v(10, 2);
//1.尾插
v.push_back(10);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

4.3 insert 接口

在指定位置插入数据,通常 vector 支持迭代器插入,但是没有明确的头插,但是使用insert可以进行头插

vector<int> v(10, 2);
//2.头插
v.insert(v.begin(), 1);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;
//3.在第三个位置进行插入
v.insert(v.begin() + 3, 1);
for (auto e : v)
{
	cout << e << " ";
}

4.4 erase 接口 

删除指定位置的数据或者删除指定区间的数据,没有头删的接口可以使用 erase 接口进行头删

vector<int> v(10, 2);
//4.头删
v.erase(v.begin());
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;
//5.删除第三个位置的数据
v.erase(v.begin() + 3);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

4.5 流插入与流提取 

与 string类不同的是 vector 不支持流插入与流提取,但是可以自己设计,更加灵活 

vector<int> v(10);
for (size_t i = 0; i < v.size(); i++)
{
	cin >> v[i];
}
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

5. vector 的不同类型元素

5.1 vector<int>

存放整数类型

//10个1
vector<int> v1(10, 1);

5.2 vector<char>

存放字符类型

//10个'a'
vector<char> v2(10, 'a');

5.3 vector<vector<int>> 

二维数组存放整数类型


	//二维数组
	vector<int> v(5, 1);//5个元素的一维数组
	vector<vector<int>> vv(10, v);//10行5列的二维数组
	//使用下标遍历二维数组
	for (int i = 0; i < vv.size(); i++)
	{
		for (int j = 0; j < v.size(); j++)
		{
			cout << vv[i][j] << " ";
		}
		cout << endl;
	}

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值