从具有 O(1) 运行时间的向量中删除元素

removing elements from a vector with O(1) runtime

"写一个函数,输入一个向量类型的对象 在常数时间 O(1) [常数] 中删除第 k 个元素。假设元素的顺序无关紧要。"

我想我可能对此有所了解。但是,当我开始尝试使用 .erase() 时,我查看了大 O 符号是什么,发现它是 O(n),就像线性关系一样。我暂时想不出任何其他方式。我不想要任何代码,但我认为如果有人可以提供帮助,伪代码至少会为我指明正确的方向

Assume that the order of elements does not matter.

这是你需要注意的。

假设你有一个向量

0 1 2 3 4 5 6

你想删除 3。你可以把它变成

0 1 2 6 4 5

在 O(1) 内没有任何问题。

其实是有办法的。这是伪代码:

  1. 如果您要删除的元素是向量中的最后一个元素,请删除它,完成。
  2. 读取向量的最后一个元素并将其写入要删除的元素。
  3. 删除向量的最后一个元素。

你可以swap and pop_back在常数时间内。

std::swap(vec.back(), vec[rank]);
vec.pop_back();