【发布时间】:2011-09-30 08:58:18
【问题描述】:
我有一个std::vector<int>,我需要删除给定索引处的所有元素(向量通常具有高维)。我想知道,考虑到应该保留原始向量的顺序,这是执行此类操作的最有效方法。
虽然,我找到了有关此问题的相关帖子,但其中一些需要删除single element 或multiple elements,其中remove-erase idiom 似乎是一个很好的解决方案。
但是,就我而言,我需要删除多个元素,并且由于我使用的是索引而不是直接值,因此无法应用 remove-erase idiom,对吗?
我的代码如下所示,我想知道在效率方面是否可以做得更好?
bool find_element(const vector<int> & vMyVect, int nElem){
return (std::find(vMyVect.begin(), vMyVect.end(), nElem)!=vMyVect.end()) ? true : false;
}
void remove_elements(){
srand ( time(NULL) );
int nSize = 20;
std::vector<int> vMyValues;
for(int i = 0; i < nSize; ++i){
vMyValues.push_back(i);
}
int nRandIdx;
std::vector<int> vMyIndexes;
for(int i = 0; i < 6; ++i){
nRandIdx = rand() % nSize;
vMyIndexes.push_back(nRandIdx);
}
std::vector<int> vMyResult;
for(int i=0; i < (int)vMyValues.size(); i++){
if(!find_element(vMyIndexes,i)){
vMyResult.push_back(vMyValues[i]);
}
}
}
【问题讨论】:
-
问题是,在删除第一个元素后索引将不再有效,与迭代器相同(您可以从具有
vec.begin() + index的索引中获取迭代器)。 -
@Georg,代码做了它应该做的。这个想法是删除给定
position处的element。在我的代码中,element由vMyValues表示,position由vMyIndexes表示。 -
我认为我在阅读时遇到了与安迪相同的盲点...您当前的代码没有就地删除,因此不存在该问题 ;)
-
如果效率是一个问题,并且如果您正在执行大量按位置删除(并且可能还插入),请考虑使用除
std::vector之外的其他容器@ ---sdt::list(链接-list 容器)或std::set(键是值本身的容器)