c++ - 从 std::vector 中删除多个对象?

标签 c++ vector

这是我的问题,假设我有一个带有整数的 std::vector。

假设它有 50,90,40,90,80,60,80。

我知道我需要删除第二个、第五个和第三个元素。我不一定总是知道要删除的元素的顺序,也不知道有多少。问题是通过删除一个元素,这会改变其他元素的索引。因此,我怎样才能删除这些并补偿索引变化。 (排序然后用偏移量线性删除不是一种选择)

谢谢

最佳答案

我提供了几种方法:

1.不保留元素原有顺序的快速方法:

将 vector 的当前最后一个元素赋值给要删除的元素,然后删除最后一个元素。这将避免大 Action ,并且除最后一个之外的所有索引都将保持不变。如果从后面开始删除,所有预计算的索引都是正确的。

void quickDelete( int idx )
{
  vec[idx] = vec.back();
  vec.pop_back();
}

我认为这基本上是 Klaim 指出的删除删除成语的手工编码版本......

<强>2。保留元素原始顺序的较慢方法:

第 1 步:标记所有要删除的 vector 元素,即使用特殊值。这有 O(|要删除的索引|)。

第 2 步:使用 v.erase( remove (v.begin(), v.end(), special_value), v.end() ); 删除所有标记的元素。这有 O(|vector v|)。

因此总运行时间为 O(|vector v|),假设索引列表比 vector 短。

3.另一种保留元素原始顺序的较慢方法:

https://stackoverflow.com/a/3487742/280314 中所述,使用谓词并删除 if .为了提高效率并尊重 不是“排序然后用偏移量线性删除”,我的想法是使用哈希表实现谓词并调整存储在哈希表中的索引,因为删除继续返回 true,正如 Klaim 建议的那样。

关于c++ - 从 std::vector 中删除多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487717/

相关文章:

C++如何获取父数据类型的sizeof?

c++ - 自动添加库

c++ - QT QWebEnginePage::setWebChannel() 传输对象

c++ - 覆盖 vector C++

javascript - JavaScript 中的按元素运算

c++ - vector 迭代器(段错误)

c++ - 为什么 future::wait() 不阻塞

c++ - 带最低频率字符的字符串查找算法

c# - 跨线程事件接收器

c++ - 转置矩阵 : swapping elements doesn't alter values