从C++ std :: vector中删除第i项

kra*_*626 32 c++ vector

如何从中删除第i项std::vector

我知道我想删除第i个元素.我int i; and std::vector<process> pList;在那里process是一个结构.我想做一些与以下相同的事情:

pList.remove(i);
Run Code Online (Sandbox Code Playgroud)

fre*_*low 81

这是一个O(1)解决方案,假设您不关心元素的顺序:

#include <algorithm>

// ...

{
    using std::swap;
    swap(pList[i], pList.back());
    pList.pop_back();
}
Run Code Online (Sandbox Code Playgroud)

对于POD,赋值比交换更快,所以你应该简单地写:

pList[i] = pList.back();
pList.pop_back();
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,您可以忘记上述区别并始终使用移动语义来实现最高效率:

if (i != pList.size() - 1)
{
    // Beware of move assignment to self
    // see http://stackoverflow.com/questions/13127455/
    pList[i] = std::move(pList.back());
}
pList.pop_back();
Run Code Online (Sandbox Code Playgroud)

  • 这很聪明,假设订单并不重要. (6认同)
  • 更快的版本会跳过交换而只是分配,因为最后一个元素无论如何都会得到 pop_backed。 (2认同)

Vla*_*mir 60

pList.erase(pList.begin()+i);
Run Code Online (Sandbox Code Playgroud)

删除索引为i的元素.

  • 注意,如果`vector`包含少于`i + 1`元素,则行为是不确定的.这可能值得注意:) (2认同)

Naw*_*waz 10

一种从线性复杂性中拯救自己的方法!

由于vector.erase()是线性复杂度,我建议只需将第i个元素与最后一个元素交换,然后在结尾处删除元素(实际上是第i个元素); 这样,你可以避免线性复杂性.这只是我的想法!


Tom*_*son 5

vector.erase(iterator)
Run Code Online (Sandbox Code Playgroud)

其中迭代器是位置。您可以使用 vector.begin() 获取第一个元素,使用 vector.end() 获取最后一个元素。只需添加到迭代器即可到达所需的元素。例如:

pList.erase(pList.begin()+6);
Run Code Online (Sandbox Code Playgroud)

删除第 6 项。