gpt4 book ai didi

c++ - 使用索引删除 std::vector 中的元素

转载 作者:IT老高 更新时间:2023-10-28 22:00:47 32 4
gpt4 key购买 nike

我有一个 std::vector<int>我需要删除给定索引处的所有元素( vector 通常具有高维)。我想知道,考虑到应该保留原始 vector 的顺序,这是执行此类操作的最有效方法。

虽然我找到了关于这个问题的相关帖子,但其中一些需要删除一个 single elementmultiple 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]);
}
}
}

最佳答案

我认为它可能会更有效,如果您只是对索引进行排序,然后从 vector 中从最高到最低删除这些元素。删除列表中的最高索引不会使您要删除的较低索引无效,因为只有高于已删除索引的元素才会更改其索引。

是否真的更有效将取决于排序的速度。关于此解决方案的另一个优点是,您不需要值 vector 的拷贝,您可以直接在原始 vector 上工作。代码应如下所示:

... fill up the vectors ...

sort (vMyIndexes.begin(), vMyIndexes.end());

for(int i=vMyIndexes.size() - 1; i >= 0; i--){
vMyValues.erase(vMyValues.begin() + vMyIndexes[i])
}

关于c++ - 使用索引删除 std::vector 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609547/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com