需要一个带有O(1)擦除的std :: vector

Abh*_*and 1 c++ inheritance memory-leaks composition stdvector

我很惊讶在调用erase时发现了vector :: erase移动元素.我认为它会将最后一个元素与"待删除"元素交换,并将大小减小一个.我的第一反应是:"让我们扩展std :: vector并覆盖erase()".但是我在很多线程中发现了" 从C++ STL容器中获取真的风险吗? ",它会导致内存泄漏.但是,我没有向vector添加任何新的数据成员.因此没有额外的内存可以释放.还有风险吗?

有些人认为我们应该更喜欢构成而不是继承.在这种情况下,我无法理解这个建议.为什么我要浪费我的时间在"机械"任务中包装其他精彩的std :: vector类的每个函数.继承确实对这项任务最有意义 - 或者我错过了什么?

cdi*_*ins 11

为什么不写一个符合你想要的独立功能:

template<typename T>
void fast_erase(std::vector<T>& v, size_t i)
{
   v[i] = std::move(v.back());
   v.pop_back(); 
}
Run Code Online (Sandbox Code Playgroud)

所有这些都归功于Seth Carnegie.我最初使用"std :: swap".

  • 更好的实现可能是`v [i] = std :: move(v.back()); v.pop_back();`,但+1 (5认同)
  • @bitmask用这种方法不是"你的容器"; 它是`std :: vector`,你只是为它编写一个非常小的实用函数.这绝对是最好的方法. (3认同)
  • @bitmmask赛斯是对的.擦除是故意保留操作的顺序. (3认同)
  • 我会用`v.pop_back()`替换`v.erase(size() - 1)` (2认同)