标准::矢量的擦除功能
Erase function of the std::vector
我有一个指向向量中元素的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
将返回一个迭代器,指向最后一个删除的元素后面的元素。也许这足以满足您的用例?
相关文章:
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 如何编写用于多映射插入和擦除功能的 API?
- 分割错误:向量中的擦除功能
- 为什么在功能内擦除元素后不列出更新?
- 标准::矢量的擦除功能
- 尝试在矢量上使用擦除功能时"no matching function for call"
- 向量擦除功能无法正常工作
- c++ std map 的擦除功能是否释放了指针键的内存?
- 为我的类实现擦除功能
- C++没有列表::擦除的匹配功能
- 使用擦除功能从字符串中删除字符 - C++
- 矢量擦除功能不工作(简单的代码)
- 矢量中的擦除功能不删除指针?
- 如何创建<wchar_t>具有擦除(size_t pos)方法的功能向量?