C++11 如何在基于范围的循环中从矢量中删除?

C++11 如何在基于范围的循环中从矢量中删除?,c++11,vector,C++11,Vector,我只想删除基于范围的循环中的指定元素: vector<int> vec = { 3, 4, 5, 6, 7, 8 }; for (auto & i:vec) { if (i>5) vec.erase(&i); } vector vec={3,4,5,6,7,8}; 用于(自动和输入:vec) { 如果(i>5) 向量擦除(&i); } 怎么了?从正在迭代的向量中删除元素通常是个坏主意。在你的情况下,你最有可能跳过7。更好的方法是使用: std

我只想删除基于范围的循环中的指定元素:

vector<int> vec = { 3, 4, 5, 6, 7, 8 };
for (auto & i:vec)
{
    if (i>5)
    vec.erase(&i);
}
vector vec={3,4,5,6,7,8};
用于(自动和输入:vec)
{
如果(i>5)
向量擦除(&i);
}

怎么了?

从正在迭代的向量中删除元素通常是个坏主意。在你的情况下,你最有可能跳过7。更好的方法是使用:


std::remove
将应该删除的元素移到容器的末尾,并将迭代器返回到这些元素中的第一个。您只需将这些元素擦除到最后。

您无法通过
std::vector
上的值擦除元素,并且由于基于范围的循环直接公开值,因此您的代码没有意义(
vec.erase(&i)

主要问题是当您删除元素时,
std::vector
会使其迭代器无效

因此,由于基于范围的循环基本上实现为

auto begin = vec.begin();
auto end = vec.end()
for (auto it = begin; it != end; ++it) {
  ..
}
然后,删除一个值将使其无效,并中断连续的迭代

如果确实希望在迭代时删除元素,则必须注意正确更新迭代器:

for (auto it = vec.begin(); it != vec.end(); /* NOTHING */)
{
  if ((*it) > 5)
    it = vec.erase(it);
  else
    ++it;
}  

很简单:不要使用基于范围的循环。这些循环旨在作为一种简洁的形式,用于顺序迭代容器中的所有值。如果您想要更复杂的内容(如擦除或通常访问迭代器),请以显式方式执行:

for (auto it = begin(vec); it != end(vec);) {
  if (*it > 5)
    it = vec.erase(it);
  else
    ++it;
}

好吧,它没有编译,让我们从那里开始@亚历杭德罗,好的!你告诉我一种方法,使它编译:)可能重复我们现在有。vec超出范围@如果呃,什么?你能详细说明一下吗?对于(const auto&i:vec)std::coutSorry;我不正确,把我的代码弄乱了
for (auto it = begin(vec); it != end(vec);) {
  if (*it > 5)
    it = vec.erase(it);
  else
    ++it;
}