如何从成对向量中删除 c++ 中 class 的值项?
How to remove from vector of pairs the value item from pair that is a class in c++?
我正在尝试删除所有比萨饼超过 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 订单:
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; }
使用额外的 while
循环是错误的。在您擦除第一个元素的那一刻,end()
迭代器失效。幸运的是,std::remove
(和 std::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());
我正在尝试删除所有比萨饼超过 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 订单:
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; }
使用额外的 while
循环是错误的。在您擦除第一个元素的那一刻,end()
迭代器失效。幸运的是,std::remove
(和 std::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());