从向量中擦除元素

从向量中擦除元素

我想使用擦除方法从向量中清除一个元素。但这里的问题是,不能保证元素在向量中只出现一次。它可能多次出现,我需要把它们全部清除。我的代码是这样的:

void erase(std::vector<int>& myNumbers_in, int number_in){
    std::vector<int>::iterator iter = myNumbers_in.begin();
    std::vector<int>::iterator endIter = myNumbers_in.end();
    for(; iter != endIter; ++iter)
    {
        if(*iter == number_in)
        {
            myNumbers_in.erase(iter);
        }
    }}int main(int argc, char* argv[]){
    std::vector<int> myNmbers;
    for(int i = 0; i < 2; ++i)
    {
        myNmbers.push_back(i);
        myNmbers.push_back(i);
    }

    erase(myNmbers, 1);

    return 0;}

这段代码显然会崩溃,因为我在迭代时更改了向量的结尾。实现这一目标的最佳途径是什么?即。有没有办法做到这一点,而不迭代向量多次或创建一个向量的副本?


动漫人物
浏览 375回答 3
3回答

ITMISS

可以使用索引访问进行迭代,为了避免O(n^2)的复杂性,可以使用两个索引:I-当前测试索引、j-索引来存储下一项和在循环结束时使用向量的新大小。代码:void&nbsp;erase(std::vector<int>&&nbsp;v,&nbsp;int&nbsp;num){ &nbsp;&nbsp;size_t&nbsp;j&nbsp;=&nbsp;0; &nbsp;&nbsp;for&nbsp;(size_t&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;v.size();&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(v[i]&nbsp;!=&nbsp;num)&nbsp;v[j++]&nbsp;=&nbsp;v[i]; &nbsp;&nbsp;} &nbsp;&nbsp;//&nbsp;trim&nbsp;vector&nbsp;to&nbsp;new&nbsp;size &nbsp;&nbsp;v.resize(j);}在这种情况下,迭代器是无效的,复杂度是O(N),代码非常简洁,您不需要编写一些帮助类,尽管在某些情况下,使用助手类可以在更灵活的代码中受益。此代码不使用erase方法,但解决了您的任务。使用纯stl,您可以这样做(这与Motti的回答类似):#include&nbsp;<algorithm>void&nbsp;erase(std::vector<int>&&nbsp;v,&nbsp;int&nbsp;num)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;vector<int>::iterator&nbsp;it&nbsp;=&nbsp;remove(v.begin(),&nbsp;v.end(),&nbsp;num); &nbsp;&nbsp;&nbsp;&nbsp;v.erase(it,&nbsp;v.end());}
打开App,查看更多内容
随时随地看视频慕课网APP