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

问题描述:

我只是想删除指定的元素,在基于范围的循环:如何从基于范围的循环中删除矢量?

vector<int> vec = { 3, 4, 5, 6, 7, 8 }; 
for (auto & i:vec) 
{ 
    if (i>5) 
    vec.erase(&i); 
} 

有什么不对?

+2

那么它不会编译,让我们开始在那里! – Alejandro

+0

@alejandro好吧!你告诉我一种方法,使其编译:) –

+0

可能重复的[从向量中删除项目,而在c + + 11范围循环?](http://*.com/questions/10360461/removing-item-from -vector-while-in-c11-range-for-loop) – manlio

您不能通过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转变,应清除容器末端的元素,并返回一个迭代器首先是这些元素。那么你只需要擦除那些元素直到最后。

+2

我们现在有['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; 
} 
+0

谢谢!我明白了你的观点。 –