std :: find和std :: find_if都返回一个迭代器 . 您可以使用此迭代器来删除或插入,您可以从此迭代器计算项的索引:
std::vector v = {'a', 'b', 'c'};
// Search for 'b'
auto it = std::find(v.begin(), v.end(), 'b');
// To get the index of 'b'
auto index = it - v.begin();
// To insert in front of 'b' (the result is a vector of 'a', 'x', 'b', 'c')
// You cannot use the iterator after this operation!
v.insert(it, 'x');
// Search 'c' and delete it
it = std::find(v.begin(), v.end(), 'c');
v.erase(it);
只要未修改向量,迭代器就是有效的 . 因此每个insert(),push_back(),erase()或clear()都会使所有迭代器无效 .
对于std :: vector,迭代器的行为类似于普通指针 . 你可以移动它(它, - it)你可以用它做数学运算(即从另一个迭代器中减去一个迭代器得到距离oder减去begin()迭代器得到绝对索引) .
如果插入或删除矢量,则必须移动部分或全部项目 . (即如果你从''a','b','c'}中删除'b','c'必须移到前'b'的位置 . 这就是为什么在修改向量后,指向已删除项目之后或之后的任何项目的迭代器都会失效的原因 .
如果向向量添加新元素,则保留的容量可能太小而无法保存新值 . 在这种情况下,分配新的存储器块,并将所有现有的项从旧的存储器块复制到新的更大的存储器块 . 因此,即使您只是追加新值,插入也可能使所有迭代器无效 .