我是一个有用的助手,可以为您翻译文本。
我手头有一个元素向量,我不关心它们的顺序。然后我有
我能想到的最好方法是将索引存储在集合中(按顺序索引)。
我手头有一个元素向量,我不关心它们的顺序。然后我有
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)似乎对我来说有点过于浪费,我很想避免排序。
编辑1: 假设我使用向量(vector)并在之后进行排序。
std::vector<unsigned int> idxs;
for (int i=0; i<N; ++i)
idxs.push_back(some_index);
std::sort(idxs.begin(), idxs.end());
我能再推进去吗?
编辑2:我应该提到这个向量将有最多10个元素。但是在我的程序中,移除操作非常频繁(数十万次)。
std::sort
。 - T.C.erase_if
,调用您的函数对象来比较索引并以此方式删除。 - EdChumremove_if
可能无法与测试元素的地址(或索引)而不是其值的谓词很好地配合使用,因为它会移动元素。 - T.C.