
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 都需要向后移动一个位置。这就会使指向这些移动元素的迭代器失效,因为它们所指向的元素位置已经发生了改变。
正确的使用方式以避免失效
要注意在插入操作前后更新迭代器。一种方法是保存插入操作返回的迭代器,这个迭代器指向新插入的元素。

被折叠的 条评论
为什么被折叠?



