c++ - 如何从对的向量中删除作为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 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
(and 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());
推荐阅读
- kubernetes - 使用 Kopf 构建的 Kubernetes Operator 的 RBAC 问题
- reactjs - 如何将 Material UI v5 连接到 Next JS v12?
- java - java.io.IOException:使用来自 Apache Commons 的 BZip2CompressorInputStream 时流意外结束
- sql - SQLite查询以查找多行之间的日期时间差异
- python - 计算数据集中所有点的所有第 n 个最近点
- python - 保存和打开张量流数据集
- google-colaboratory - Tensorboard 不会在 Google Colab 上初始化
- android - 如何在屏幕的特定区域触发 MotionLayout 滑动动画?
- javascript - 更新:如何从弹出窗口中的母页发送请求显示数据?
- terraform - 优先使用 Terraform 进行 AWS 更改