如何从成对向量中从c ++中的类对中删除值项?

问题描述 投票:0回答:1

我正在尝试删除所有披萨超过3天的订单:

我有这个向量对:

 std::vector<std::pair<Client,Order>> x;
    x.push_back(std::make_pair(Client(2,"Anca"),Order(3,1)));
    x.push_back(std::make_pair(Client(16,"Maria"),Order(1,3)));
    x.push_back(std::make_pair(Client(29,"Alex"),Order(10,5)));

和该类订单:

class Order{
private:
    int amountPizza;
    int pizzaAge;
public:
int getPizzaAge(){
        return pizzaAge;
    }

我做了这样的事情:

auto it=x.begin();
   while(it!=x.end()){
        if((it->second).getPizzaAge()>3){
            x.erase(std::remove(x.begin(),x.end(),it->second),x.end());
        }
        it++;
    }

并且不起作用。

Errors:

error: no match for 'operator==' (operand types are 'std::pair<Client, Order>' and 'const Order')
  { return *__it == _M_value; }
 'std::pair<Client, Order>' is not derived from 'const __gnu_cxx::__normal_iterator<_IteratorL, _Container>'
  { return *__it == _M_value; }
c++ std-pair erase-remove-idiom
1个回答
0
投票

使用额外的while循环是错误的。擦除第一个元素后,end()迭代器将失效。幸运的是,std::remove(和std::remove_if)可以在一个调用中处理任意数量的元素。

第二个问题是std::remove仅可用于删除完全相同的元素。但是,对于std::remove_if,您可以提供比较灵活的比较功能。

您的代码应如下所示:

auto newEnd = std::remove_if(x.begin(), x.end(), [](const auto& p) {
    return p.second.getPizzaAge() > 3;
});
x.erase(newEnd, x.end());
© www.soinside.com 2019 - 2024. All rights reserved.