Как удалить из вектора пар элемент значения из пары, которая является классом в c ++? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь удалить все заказы, в которых есть старая пицца более 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)));

и этот класс Order:

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; }

1 Ответ

2 голосов
/ 06 мая 2020

Использование extra while l oop неверно. В тот момент, когда вы стираете первый элемент, итератор end() становится недействительным. К счастью, std::removestd::remove_if) может обрабатывать любое количество элементов за один вызов.

Вторая проблема заключается в том, что std::remove можно использовать только для удаления точно таких же элементов (по сравнению с operator ==). Однако, используя 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());
...