标准::矢量的擦除功能

Erase function of the std::vector

本文关键字:擦除 功能 标准      更新时间:2023-10-16

我有一个指向向量中元素的std::vector和一个迭代器。我的问题是如何从向量中删除元素并保留迭代器?

我尝试使用第二个迭代器来查找我要删除的特定元素,并且在使用 erase 函数擦除它后,第一个迭代器变得无效。

我有一个std::vector和一个指向向量中元素的迭代器。我的问题是如何从向量中删除元素并保留迭代器?

请注意,当一个元素被删除时,任何迭代器都不能指向它,因为它不复存在。因此,引用它的位置正常做法是使用从erase()方法返回的迭代器。这允许使用insert()方法,该方法会将一个值放在先前擦除的对象的位置。 使用一个迭代器,只需使用以下命令:

auto loc_after = v.erase(iter);  // since the element has been erased loc_after points to the position the erased element had

我尝试使用第二个迭代器来查找我要删除的特定元素,并且在使用 erase 函数擦除它后,第一个迭代器变得无效。

在两个迭代器的情况下,可以通过首先擦除物理上最后一个迭代器来轻松擦除元素,因为较早的迭代器不会失效。这封装在一个函数中。返回的迭代器指向 1 过去"第一个"迭代器的位置,而不考虑第一个迭代器和第二个迭代器之间的顺序。

#include <vector>
#include <iostream>
// This returns an iterator positioned after where  first_iter was before being erased
// this allows the insert(pos, val) method to insert a value in the the location just prior to pos
std::vector<int>::iterator second_iterator_loc(std::vector<int>& v, std::vector<int>::iterator first_iter, std::vector<int>::iterator second_iter)
{
std::vector<int>::iterator iter;
if (first_iter < second_iter)
{
v.erase(second_iter);
iter = v.erase(first_iter);
}
else if (second_iter < first_iter)
{
auto dist = first_iter - second_iter;
v.erase(first_iter);
iter = v.erase(second_iter) + dist - 1;
}
else
{
;// handler in case both iterators point to the same object
}
return iter;
}
int main()
{
std::vector<int> v{ 1,2,3,4,5 };
std::vector<int> v2 = v;
std::vector<int>::iterator iter1 = v.begin() + 1; // points to 2 in v
std::vector<int>::iterator iter2 = v.begin() + 3; // points to 4 in v
std::vector<int>::iterator iter;
iter = second_iterator_loc(v, iter1, iter2);
v.insert(iter, 9);  // inserts a 9 in the previous location of the "first" iterator (where "2" was)
for (auto x : v)
std::cout << x << 'n'; // prints: 1 9 4 5
v = v2;
iter1 = v.begin() + 3; // reverse iterator positions
iter2 = v.begin() + 1;
iter = second_iterator_loc(v, iter1, iter2);
v.insert(iter, 9);  // inserts a 9 in the previous location of the "first" iterator (where "4" was)
for (auto x : v)
std::cout << x << 'n'; // prints: 1 3 9 5
}

我的问题是如何从向量中删除元素并保留迭代器?

你不能使用std::vector::iterator.迭代器将通过擦除元素而失效。

但是,您可以通过编写自己的迭代器类来实现此目的,该迭代器类存储指向向量的指针和索引。

std::vector::erase将在擦除元素时或之后使所有迭代器失效:

使迭代器和引用在 擦除,包括 end(( 迭代器。

但是,erase将返回一个迭代器,指向最后一个删除的元素后面的元素。也许这足以满足您的用例?