C++ vector(1)

int main(void)
{
	vector<int> d(1);//(1)
	vector<double>a(10, 3.2);//(2)
	string str ("helloworld");
	vector<char> b(str.begin(), str.end());//(3)用其他迭代器去取件初始化
	int aa[] = { 1,22,3,423,4,234,234,24,23,5442,5 };
	vector<int> c(aa, aa + 2);//(3)数组是一种天然的迭代器
	for (auto e:a)
	{
		cout << e << " ";
	}
	cout << endl;
	for (auto e : b)
	{
		cout << e << " ";
	}
}

(4)是拷贝构造 

 sort函数

这个函数需要包含一个算法的头文件#include <algorithm>

可以传一个迭代区间

要排降序的话就要加一个greater了(当然升序是less,你不写1默认是升序!)

用rbegin和rend也可以!

int main(void)
{
	int arr1[20] = { 342,4,234,234,325,34,531,46,46,23,52,41,5,524,5,432,534,5,24,523 };
	vector<int> arr2(2);
	arr2.push_back(34);
	arr2.push_back(23);
	arr2.push_back(13);
	greater<int> aa;
	sort(arr1, arr1 + 20,aa);
	//匿名对象更香sort(arr1, arr1+20,greater<int>());
	for (auto e : arr1)
	{
		cout << e << " ";
	}
	cout << endl;
		for (auto e : arr2)
		{
			cout << e << " ";
		}
	return 0;
}

和string一样,vector的迭代器也有普通对象的和const对象的,以及针对顺置和逆置的

包括string里面的size max_size,vector里面用法也差不多

将一些不一样的 

但是你会发现vector里面没有find函数,为什么?

这个啥时候的find函数在算法的那个头文件里面

#include <algorithm>

因为string里面的find可能是找一个字符串也可能是找一个字符,包括在哪些范围内寻找,要求比vector的find要高,因此string的vector是单独实现的,而vector包括后面的list那些都用的是算法里面的那个find

我们再来看

 vector里面的data相当于string里面的什么?

相当于string里面的c_str

assign是一种赋值,但它不是用对象去赋值,而是用一段区间或者n个value进行赋值

就是把原有的代码清理掉,再输入要赋值的内容

******迭代器失效******

Erase导致的迭代器失效

容器内部结构改变
在 vector 中,当使用 erase 操作删除元素时,容器的内部结构会发生改变。 vector 内部是一个连续的内存空间,用于存储元素。当删除一个元素时,后面的元素需要向前移动来填补被删除元素留下的空位。


例如,假设有一个 vector<int> ,存储了元素 {1, 2, 3, 4, 5} ,如果使用 erase 删除元素 3 ,那么 4 和 5 会向前移动一个位置。
迭代器指向位置改变
对于指向被删除元素之后的迭代器,在 erase 操作后它们所指向的元素位置会发生改变。因为元素的移动,原本指向后面元素的迭代器现在指向的是其他元素了。


假设 vector<int>::iterator it = v.begin() + 2; (此时 it 指向元素 3 ),执行 v.erase(it) 后,原来指向元素 4 ( it + 1 )的迭代器现在指向了元素 5 ,这就导致了迭代器的逻辑错误。
迭代器失效的范围


不仅是指向被删除元素的迭代器会失效,指向被删除元素之后的所有迭代器都会失效。这是因为容器内部的元素重新排列了,这些迭代器所指向的逻辑位置已经不准确了。


例如,在一个 vector 中有多个迭代器指向不同元素,一旦执行了 erase 操作,所有位于被删除元素之后的迭代器都不能再被安全使用。

Insert导致的迭代器失效

内存重新分配
当 vector 插入元素时可能会引起内存重新分配。

 vector 在内存空间不足时会重新分配一块更大的连续内存空间,然后将原来的元素复制或移动到新的内存空间中。


例如,假设 vector 初始有一定大小的内存空间,当不断插入元素导致其容量不够时,它会重新分配内存。

如果有迭代器指向原来内存空间中的元素,在重新分配内存后,这些迭代器就会失效,因为它们指向的是已经被释放的旧内存地址。
元素移动


即使没有发生内存重新分配,插入元素也可能导致插入点之后的元素移动。 vector 内部是连续存储元素的,插入一个元素时,插入点之后的元素都需要向后移动来为新元素腾出空间。


比如,有一个 vector<int> 存储着 {1, 2, 3, 4, 5} ,如果在 2 后面插入一个元素,那么 3 、 4 、 5 都需要向后移动一个位置。这就会使指向这些移动元素的迭代器失效,因为它们所指向的元素位置已经发生了改变。


正确的使用方式以避免失效
要注意在插入操作前后更新迭代器。一种方法是保存插入操作返回的迭代器,这个迭代器指向新插入的元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值