假设我有一个带有5个元素的std :: vector,我需要删除索引1和3中的元素,这是最快的方法.标准库中是否有任何帮助方法可以为我执行此操作?
你可以使用这个erase功能.对于这个特定情况,你提到这样的事情:
myvector.erase (myvector.begin()+3);
myvector.erase (myvector.begin()+1);
Run Code Online (Sandbox Code Playgroud)
会做的.你必须为erase函数提供一个迭代器,我建议你阅读它的使用文档.以上内容适用于您的情况.请注意,每次调用擦除都会更改删除位置后剩余元素的索引,但内部数组元素将相对于删除的项目进行调整.
在回复您的注释时,您一次只能擦除一个元素,除非它们是连续的索引,在这种情况下,您可以使用基于范围的擦除版本作为开始和结束迭代器.例如,如果要删除索引1,2和3使用
myvector.erase (myvector.begin()+1,myvector.begin()+4);
Run Code Online (Sandbox Code Playgroud)
正如我已经提到的那样,在您擦除的项目之后的项目索引将相应地降档.这是不可避免的,因为数组中不能有"间隙".
这应该是一个相当有效的实现,使用std::move并且每次只移动每个元素一次.它要求索引删除to_remove以进行排序.
template<typename T>
void remove_index(std::vector<T>& vector, const std::vector<int>& to_remove)
{
auto vector_base = vector.begin();
std::vector<T>::size_type down_by = 0;
for (auto iter = to_remove.cbegin();
iter < to_remove.cend();
iter++, down_by++)
{
std::vector<T>::size_type next = (iter + 1 == to_remove.cend()
? vector.size()
: *(iter + 1));
std::move(vector_base + *iter + 1,
vector_base + next,
vector_base + *iter - down_by);
}
vector.resize(vector.size() - to_remove.size());
}
// Usage:
//
// std::vector<std::string> values = { "0", "1", "2", "3", "4", "5"};
// remove_index(values, { 1, 3 });
Run Code Online (Sandbox Code Playgroud)