【发布时间】:2014-09-01 08:45:55
【问题描述】:
我拥有的是元素的向量,我不关心它们的顺序。
比我有N 要从向量中删除的元素的索引(每个索引在向量中的唯一位置)。我希望尽快删除。
我能想到的最好办法是将索引存储在集合中(顺序索引):
std::set<unsigned int> idxs;
for (int i=0; i<N; ++i)
idxs.insert(some_index);
然后以相反的顺序迭代集合并用向量的最后一个元素替换要删除的索引。
std::set<unsigned int>::reverse_iterator rit;
for (rit = idxs.rbegin(); rit != idxs.rend(); ++rit) {
vec[*rit].swap(vec[vec.size() - 1]);
vec.resize(vec.size() - 1);
}
但是我在想是否有更有效的方法来做到这一点,因为 set 的使用对我来说似乎有点矫枉过正,我很想避免排序全部。
EDIT1: 让我们假设我使用向量并在之后对其进行排序。
std::vector<unsigned int> idxs;
for (int i=0; i<N; ++i)
idxs.push_back(some_index);
std::sort(idxs.begin(), idxs.end());
我可以再推它吗?
EDIT2: 我应该提到该向量将包含多达 10 个元素。但是,我的程序中的删除经常发生(数十万次)。
【问题讨论】:
-
通常当你想要排序时,你使用
std::sort。 -
我能想到的 2 种方法:1. 迭代并创建不在索引列表中的元素的新向量。 2.定义一个仿函数并使用
erase_if并调用您的仿函数,它将比较索引并以这种方式擦除。 -
@EdChum 没有
erase_if这样的东西。 -
@T.C.对不起
remove_if -
这些向量有多大,如果它们很小,那么从有效索引创建一个新向量应该是微不足道和快速的