擦除for(-each)自动循环中的项目

Val*_*ond 5 c++ iterator std auto

有没有办法在这样的for循环中使用自动变量时擦除特定元素?

for(auto a: m_Connections)
{
    if(something)
    {
        //Erase this element

    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以说

for(auto it=m_map.begin() ...
Run Code Online (Sandbox Code Playgroud)

要么

for(map<int,int>::iterator it=m_map.begin() ...
Run Code Online (Sandbox Code Playgroud)

并手动增加迭代器(和擦除),但如果我能用更少的代码行完成它,我会更高兴.

谢谢!

Mik*_*our 7

你不能.基于范围的循环使得范围内的简单迭代更简单,但不支持使范围或其使用的迭代器无效的任何内容.当然,即使支持它,也无法在不访问迭代器的情况下有效地擦除元素.

你需要一个老式的循环,沿着这条线

for (auto it = container.begin(); it != container.end();) {
    if (something) {
        it = container.erase(it);
    } else {
        ++it;
    }
}
Run Code Online (Sandbox Code Playgroud)

或组合container.erase()std::remove_if,如果你喜欢之类的事情.


man*_*lio 5

不,没有.基于范围的循环用于访问容器的每个元素一次.

每次从容器中删除元素时,擦除元素处或之后的迭代器都不再有效(并且考虑到基于范围的实现 -这是一个问题).

while如果需要随意修改容器,则应使用normal for循环(或a ).

如果要擦除谓词返回的元素true,一个好方法是:

m_Connections.erase(
  std::remove_if(m_Connections.begin(),
                 m_Connections.end(),
                 [](Type elem) { return predicate(elem); }),
  m_Connections.end());
Run Code Online (Sandbox Code Playgroud)

std :: remove_if不会将迭代逻辑与谓词混合.