【发布时间】:2012-12-10 15:34:08
【问题描述】:
我想在迭代向量时擦除某些元素,但下面的代码导致“向量迭代器不可递增”断言失败。
for(auto iter=vec.begin(); iter!=vec.end(); ++iter)
{
if((*iter).isDead())
{
std::swap(*iter, vec.back());//swap with the back
vec.pop_back(); //erase the element
}
}
这段代码有什么问题?
【问题讨论】:
-
寻找remove_if,如果返回isDead怎么办?
-
我不关注。预期的结果是什么?为什么?
-
@NoSenseEtAl:在某些情况下,“交换和弹出”是对
remove_if的大规模优化,因此 IMO 值得知道如何正确地做到这一点。可以说这种情况在实践中很少见,但比较这两种情况,向量元素类型的移动/复制成本很高,并且只有一个死元素,vec[0]。 -
WTF,这个Q怎么太本地化了,Steve Jessop刚刚解释了为什么知道它是件好事……我猜关闭Q的人忙着关闭Q而无法阅读所有的cmets。
-
当然,这个问题非常重要,一点也不“过于本地化”。