vector的用法

vector 底层实现的方式为一个顺序表 容量按照vs每次1.5倍的增张,gcc为2倍实现不同那么增长方式就不同

vector的构造方式

	vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
	vector<int> ar2(ar1.begin(), ar1.end());
	vector<int> ar3(10, 1);
	vector<int> ar4(ar2); //深拷贝
	Printf(ar2);
	Printf(ar3);

三种构造方式,第二个使用迭代器构造,将ar3初始化为10个1;
打印结果如下:
在这里插入图片描述

迭代器的使用 iterator

iterator由于比较复杂在C++11中使用auto关键字定义就行。
1)begin()返回的是第一个元素的地址
2)end()返回的是最后一个元素的下一个元素的位置(无效值)
3)rbegin()返回的是最后一个元素的位置
4)rend()返回的是第一个元素的前一个元素的位置(无效值)
5)对rbegin++相当于往后走,对rend++相当于往前走;

void TestIterator1()
{
	vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
	auto vi1 = ar1.begin();
	auto vi2 = ar1.end();
	auto vi3 = ar1.rbegin();
	auto vi4 = ar1.rend();
	cout << *vi1 << endl;
	cout << *vi2 << endl;
	cout << *vi3 << endl;
	cout << *vi4 << endl;
}

在这里插入图片描述

vector的增删查改

1)reserve 改变容量的大小
2)resize 改变有效值的个数,如果大于写了val则将多得值初始化为val,如果不写默认为0;
3)push_back 在末尾插一个元素,如果本来就每元素那么在debug下 会报错,最好还是判断一下;
4)pop_back 尾删,没啥说的
5)insert 在一个元素之前插另一个元素(见迭代器失效)

void Testalter()
{
	vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
	cout << ar1.capacity() << endl;
	ar1.reserve(40);
	cout << ar1.capacity()<<endl;
	cout << ar1.size() << endl;
	ar1.resize(20);
	cout << ar1.size() << endl;
	Printf(ar1);
	cout << endl;
	ar1.resize(50, 99);
	Printf(ar1);
}

在这里插入图片描述

迭代器的失效

当迭代器所在的元素被删除,原空间发生变化的时候就会发生迭代器的失效
下面的源码稍微复杂但是很简单!

void ittset() {
	
	vector<int> v = { 1,2,3,4,5,6,7,8,9 };
	vector<int> v1 = {99,99,99};
	auto vi = v.begin() + 1;
	vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	v.erase(pos); //此时迭代器失效
	cout << *pos << endl; //bebug下会崩溃但是在rel版本下可以打出来,因为rel下没有内存检测
	cout << *vi<<endl;   
	vi = v.erase(vi);  //但是可以获取erase的返回值,如果获取的了那么得到的是vi原来位置元素的值
	cout << *vi << endl;
	vi=v.insert(v.begin() + 1, v1.begin(), v1.end());//获取vi现在的位置
	cout << *vi++ << endl;
	cout << *vi++ << endl;
	cout << ++*vi << endl;
	//insdert 和 erase 都会导致迭代器失效 那么可以获取其的返回值,获取的返回值为操作之后的位置。
}

rel下打出的值在这里插入图片描述
可以看见*vi在获取到返回值后可以继续使用。获取的返回值为新空间相对于的返回值

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值