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)
并手动增加迭代器(和擦除),但如果我能用更少的代码行完成它,我会更高兴.
谢谢!
你不能.基于范围的循环使得范围内的简单迭代更简单,但不支持使范围或其使用的迭代器无效的任何内容.当然,即使支持它,也无法在不访问迭代器的情况下有效地擦除元素.
你需要一个老式的循环,沿着这条线
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,如果你喜欢之类的事情.
不,没有.基于范围的循环用于访问容器的每个元素一次.
每次从容器中删除元素时,擦除元素处或之后的迭代器都不再有效(并且考虑到基于范围的实现 -这是一个问题).
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不会将迭代逻辑与谓词混合.