C++ vector.erase和std::在自定义向量上删除

C++ vector.erase和std::在自定义向量上删除,c++,vector,stl,C++,Vector,Stl,我有一个int对向量。假设Itr是这个向量的迭代器。 我想迭代向量并决定是否从向量中删除元素。如果向量的元素是9001,3,那么我想从向量中删除itr->first为9001的所有元素(不管itr->second是什么) 问题: 如何移除这个int对向量。以下方法行不通: vec.erase(std::remove(vec.begin(),vec.end(),Itr->first=9001),vec.end()) 我可以给出一个从vec.begin()到vec.end()的范围吗 vec.beg

我有一个int对向量。假设Itr是这个向量的迭代器。 我想迭代向量并决定是否从向量中删除元素。如果向量的元素是
9001,3
,那么我想从向量中删除
itr->first
为9001的所有元素(不管
itr->second是什么)

问题:

  • 如何移除这个int对向量。以下方法行不通:
    vec.erase(std::remove(vec.begin(),vec.end(),Itr->first=9001),vec.end())
  • 我可以给出一个从vec.begin()到vec.end()的范围吗 vec.begin as
    (当前元素是向量指针)-10
    和 ve.end为
    (当前元素由向量指向)+10
    示例:
    vec.erase(std::remove(Itr-10,Itr+10,Itr->first=9001),vec.end()

    如果向量大小本身小于10,Itr+10 ot Itr-10可能会导致分段错误。那么如何应对这种情况呢

        vector<pair<int,int> > vec;
    
        vec.push_back(pair<int,int>(9001,1));
        vec.push_back(pair<int,int>(9001,2));
        vec.push_back(pair<int,int>(9001,3));
        vec.push_back(pair<int,int>(9001,4));
        vec.push_back(pair<int,int>(9002,1));
        vec.push_back(pair<int,int>(9002,2));
        vec.push_back(pair<int,int>(9002,3));
        vec.push_back(pair<int,int>(9002,4));
        vec.push_back(pair<int,int>(9002,5));
    
    
        vector<pair<int,int> >::iterator Itr;
        for(Itr=vec.begin();Itr!=vec.end();++Itr)
                cout<<vecItr->first<<" "<<vecItr->second;
    
    //  vec.erase(std::remove(Itr-10, Itr+10, Itr->first=9001), vec.end()); //This doest work
    
        for(Itr=vec.begin();Itr!=vec.end();++Itr)
                cout<<Itr->first<<" "<<Itr->second;
    
    vec;
    向量推回(成对(9001,1));
    向量推回(成对(9001,2));
    向量推回(成对(9001,3));
    向量推回(成对(9001,4));
    向量推回(成对(9002,1));
    向量推回(成对(9002,2));
    向量推回(成对(9002,3));
    向量推回(成对(9002,4));
    向量推回(成对(9002,5));
    向量::迭代器Itr;
    对于(Itr=vec.begin();Itr!=vec.end();++Itr)
    库特
    如何移除这个int对向量。以下方法行不通:

    如果算法:

    vec.erase(std::remove_if(vec.begin(), vec.end(), 
                             [](auto& elem){ return elem.first == 9001;} ),
              vec.end());
    
    使用自定义比较器:

    struct elem_equals
    {
        typedef std::pair<int,int> elem_t
        const int value;
    
        elem_equals(int v) : value(v) {}
    
        bool operator()(elem_t& elem) 
        {
            return elem.first == value;
        }
    };
    
    //...
    
    vec.erase(std::remove_if(vec.begin(), vec.end(), 
                             elem_equals(9001) ),
              vec.end());
    
    如何移除这个int对向量。以下方法行不通:

    如果算法:

    vec.erase(std::remove_if(vec.begin(), vec.end(), 
                             [](auto& elem){ return elem.first == 9001;} ),
              vec.end());
    
    使用自定义比较器:

    struct elem_equals
    {
        typedef std::pair<int,int> elem_t
        const int value;
    
        elem_equals(int v) : value(v) {}
    
        bool operator()(elem_t& elem) 
        {
            return elem.first == value;
        }
    };
    
    //...
    
    vec.erase(std::remove_if(vec.begin(), vec.end(), 
                             elem_equals(9001) ),
              vec.end());
    

    使用适当的lambda如何?使用适当的lambda如何?lambda不接收迭代器,而是接收实际的元素。在lambda参数中使用auto是c++14。@stefaanv谢谢,修复了。对于C++14,没有不使用它的要求。但无论如何我都会改变它。不幸的是,我不在C++11或更高版本上使用lambda。我还有其他选择吗?@anurag86,当然,自定义比较器。我现在将编辑我的答案并添加示例我并不是说你不应该使用C++14,我只是向那些尝试你的示例的人指出。1中的2个注释可能有点混淆。lambda不接收迭代器,而是接收实际元素。在lambda参数中使用auto是c++14。@stefaanv谢谢,修复了。对于C++14,没有不使用它的要求。但无论如何我都会改变它。不幸的是,我不在C++11或更高版本上使用lambda。我还有其他选择吗?@anurag86,当然,自定义比较器。我现在将编辑我的答案并添加示例我并不是说你不应该使用C++14,我只是向那些尝试你的示例的人指出。1中的2个备注可能有点混淆。