我是C++的新手.我想知道经验丰富的程序员是如何做到这一点的.
是)我有的:
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
for(set<int>::iterator itr = s.begin(); itr != s.end(); ++itr){
if (!(*itr % 2))
s.erase(itr);
}
Run Code Online (Sandbox Code Playgroud)
当然,它不起作用.因为itr在擦除后会递增.这是否意味着Itr必须在每次擦除集合中的元素后指向集合的开头?
pm1*_*100 16
for(set<int>::iterator itr = s.begin(); itr != s.end(); ){
if (!(*itr % 2))
s.erase(itr++);
else ++itr;
}
Run Code Online (Sandbox Code Playgroud)
Scott Myers的有效STL
你不需要回到起点.set::erase只会使引用被删除项的迭代器无效,所以你只需要在删除之前复制迭代器和增量:
for(set<int>::iterator itr = s.begin(); itr != s.end();)
{
set<int>::iterator here = itr++;
if (!(*here % 2))
s.erase(here);
}
Run Code Online (Sandbox Code Playgroud)