【发布时间】:2014-06-09 20:00:29
【问题描述】:
通常,我们希望使用erase remove idiom 来正确地从向量中删除元素,例如:
v.erase( std::remove( std::begin(v), std::end(v), 5 ), std::end(v) );
其中 v 是整数向量。
但是如果首先对向量进行排序呢?以下是否会做同样的事情,如果是,它是最优化的方式吗?
std::sort(v.begin(), v.end());
IntegerVector::iterator it = std::lower_bound(v.begin(), v.end(), 5);
if(it != v.end()) {
(void)v.erase(it, v.end());
}
这是否正确应用了擦除删除习语?在删除过程之后,向量是否仍然排序(我假设是)?我们不需要做这样的事情吗:
(void)v.erase(std::remove(it), v.end());
(std::remove 的语法不正确,但希望你明白)。
谢谢,
本。
【问题讨论】:
-
注意:你不必写
(void)v.erase(...);;v.erase(...);也会这样做。 -
Dieter,这是真的,但擦除返回一个迭代器,对于完全无 lint 的代码,有必要将其强制转换为 void。我喜欢我的代码不掉毛
-
您似乎正在从第一次出现的 5 开始擦除 所有 元素?