【发布时间】:2019-12-30 03:30:55
【问题描述】:
我有一个对象向量,想按值删除。但是,该值只出现一次,我不关心排序。
显然,如果这种按值删除非常普遍,和/或数据集相当大,那么向量就不是最好的数据结构。但假设我已经确定不是这种情况。
明确地说,如果我的代码是 C,我会对以下内容感到满意:
void delete_by_value( int* const piArray, int& n, int iValue ) {
for ( int i = 0; i < n; i++ ) {
if ( piArray[ i ] == iValue ) {
piArray[ i ] = piArray[ --n ];
return;
}
}
}
似乎使用 std::algos 和容器方法的“现代成语”方法是:
v.erase(std::remove(v.begin(), v.end(), iValue), v.end());
但这应该慢得多,因为对于随机存在的元素,它是 n/2 移动和 n 比较。我的版本是 1 步,n/2 比较。
在“现代成语”中肯定有比擦除-删除-成语更好的方法吗?如果不是,为什么不呢?
【问题讨论】:
-
std::find为您找到该值,如果它存在,那么它几乎就像在 C 中发生的那样。这一切都归结为,几乎与 C 相同。 -
这两个代码示例不等价。一个使用无法调整大小的数组,而
vector版本会调整大小。 -
非常感谢;我有点发疯了;通过引用传递 n,因此调用者对数组的视图实际上已调整大小,并且发现我认为比“开明”更好的措辞
-
您是否考虑过使用
std::list而不是std::vector?因为std::list是一个链接列表,您可以删除列表中的任何项目而无需进行任何复制。缺点是访问元素是线性时间。 -
@SwissFrank 其中两个答案都使用
erase()或resize()删除最后一个元素,使用pop_back()可以更简单地完成
标签: c++ algorithm erase-remove-idiom