如何从基于范围的循环中删除矢量?
我只是想删除指定的元素,在基于范围的循环:如何从基于范围的循环中删除矢量?
vector<int> vec = { 3, 4, 5, 6, 7, 8 };
for (auto & i:vec)
{
if (i>5)
vec.erase(&i);
}
有什么不对?
您不能通过std::vector
上的值擦除元素,并且由于基于范围的循环直接暴露了您的代码无意义的值(vec.erase(&i)
)。
主要问题是std::vector
在擦除元素时会使其迭代器无效。
如此以来,基于范围的环路基本上是作为
auto begin = vec.begin();
auto end = vec.end()
for (auto it = begin; it != end; ++it) {
..
}
实现然后擦除值将无效it
并打破连续的迭代。
如果你真的想删除一个元素,而迭代你必须采取正确更新迭代器的护理:
for (auto it = vec.begin(); it != vec.end(); /* NOTHING */)
{
if ((*it) > 5)
it = vec.erase(it);
else
++it;
}
从您正在迭代的矢量中移除元素通常是一个坏主意。在你的情况你最有可能跳过将使用std::remove_if
它的7更好的方法:
vec.erase(std::remove_if(vec.begin(), vec.end(),
[](const int& i){ return i > 5; }),
vec.end());
std::remove
转变,应清除容器末端的元素,并返回一个迭代器首先是这些元素。那么你只需要擦除那些元素直到最后。
我们现在有['std :: experimental :: erase_if'](http://en.cppreference.com/w/cpp/experimental/vector/erase_if )。 –
这很简单:不使用基于范围的循环。这些循环旨在作为的简明形式,依次遍历容器中的所有值。如果你想更复杂的东西(如删除或一般访问迭代器),做了明确的方法:
for (auto it = begin(vec); it != end(vec);) {
if (*it > 5)
it = vec.erase(it);
else
++it;
}
谢谢!我明白了你的观点。 –
那么它不会编译,让我们开始在那里! – Alejandro
@alejandro好吧!你告诉我一种方法,使其编译:) –
可能重复的[从向量中删除项目,而在c + + 11范围循环?](http://*.com/questions/10360461/removing-item-from -vector-while-in-c11-range-for-loop) – manlio