繁体   English   中英

vector.erase和std ::在自定义矢量上删除

[英]vector.erase and std::remove on custom vector

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

问题:

  1. 我如何删除此整数对向量。 以下代码不起作用: vec.erase(std::remove(vec.begin(), vec.end(), Itr->first=9001), vec.end());
  2. 代替给vec.begin()到vec.end()的范围,我可以给vec.begin作为(current element being pointer by vector) - 10和ve.end作为(current element being pointed by vector)+10吗?

例如: vec.erase(std::remove(Itr-10, Itr+10, Itr->first=9001), vec.end());

如果向量大小本身小于10,则Itr + 10或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;

我如何删除此整数对向量。 以下内容不起作用:

将lambda或自定义比较器与remove_if算法一起使用:

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());

代替给vec.begin()到vec.end()的范围,我可以给vec.begin作为(current element being pointer by vector) - 10ve.end as (current element being pointed by vector)+10吗?

是。 向量迭代器支持指针算术,因此很容易。

如果向量大小本身小于10,则Itr + 10或Itr-10可能会导致分段错误,这很安静。那么如何处理这种情况?

如果在迭代器之前或之后没有足够的元素,请固定范围:

//iter is an iterator to vector
//vec is instance of std::vector
//replace auto with std::vector<std::pair<int,int> >::iterator for non C++11 compilers
auto begin = iter - std::min(10, iter - vec.begin());
auto end = iter + std::min(10, vec.end() - iter);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM