C++ merge std::在一个成员变量上设置

C++ merge std::在一个成员变量上设置,c++,stl,C++,Stl,我在这里的要求是,如果价格相同,但隐含成本不同,则合并这两套产品的数量 电流输出: 价格:100 i示例:0 数量:10 售价:200 i示例:0 数量:20 由于价格100和200已经存在于集合中,因此p3和p4的插入被忽略 所需输出: 价格:100 i示例:0 数量:40(10+30)(数量合并为P1和P3价格相同但隐含值不同) 售价:200 i示例:0 数量:60(20+40)(数量合并为P2和P4价格相同,但隐含值不同) class价格级别 { 公众: 国际价格; 整数数量; 布尔是隐含

我在这里的要求是,如果价格相同,但隐含成本不同,则合并这两套产品的数量

电流输出:

价格:100 i示例:0 数量:10

售价:200 i示例:0 数量:20

由于价格100和200已经存在于集合中,因此p3和p4的插入被忽略

所需输出:

价格:100 i示例:0 数量:40(10+30)(数量合并为P1和P3价格相同但隐含值不同)

售价:200 i示例:0 数量:60(20+40)(数量合并为P2和P4价格相同,但隐含值不同)

class价格级别
{
公众:
国际价格;
整数数量;
布尔是隐含的;
价格水平(整数价格、整数数量、布尔值)
{
价格=_价格;
数量=_数量;
isImplied=_isImplied;
}

friend bool运算符如果您还需要保留数量,则您的比较函数应使用该信息。set comparison在严格弱顺序下工作。 实现这一点有两种方法。选择最适合您的设计的方法

1.与其保留一组PriceLevel本身,不如保留一个键作为价格,值作为数量。您的更新功能如下所示:

void update(map<int, int> &valueMap, const PriceList &val)
{
    valueMap[val.price] += val.qty;    
}
void update(set<PriceList> &valueMap, PriceList val)
{
    auto iter = valueMap.find(val);
    if (iter != valueMap.end())
    {
        val.qty = iter->qty + val.qty;
        valueMap.erase(iter);
    }
    valueMap.insert(val);
}
void更新(映射和值映射、常量价格表和值)
{
valueMap[val.price]+=val.qty;
}
` 2.修改集合中的插入逻辑。更新将类似于:

void update(map<int, int> &valueMap, const PriceList &val)
{
    valueMap[val.price] += val.qty;    
}
void update(set<PriceList> &valueMap, PriceList val)
{
    auto iter = valueMap.find(val);
    if (iter != valueMap.end())
    {
        val.qty = iter->qty + val.qty;
        valueMap.erase(iter);
    }
    valueMap.insert(val);
}
void更新(set&valueMap,PriceList val)
{
自动iter=valueMap.find(val);
if(iter!=valueMap.end())
{
val.qty=iter->qty+val.qty;
擦除(iter);
}
valueMap.插入(val);
}
很明显,您的比较功能需要更新以说明数量。 它应该看起来像

bool comp(const PriceList& val1, const PriceList& val2)
{
    return make_pair(val1.price, val1.qty) < make_pair(val2.price, val2.qty);
}
bool comp(常量价格表和val1、常量价格表和val2)
{
返回make_对(val1.price,val1.qty)
您希望执行以下操作。请注意,我们只执行一次查找

// attempt to insert
std::pair<bool, std::set<PriceLevel>::iterator> result = s1.insert(p1);
if (result.first)  // insert did not work since element already existed
{
    PriceLevel & temp = *(result.second);
    if (temp.isImplied != p1.isImplied)
    {
        temp.qty += p1.qty;  // sum
    }
    else
    {
        temp.qty = p1.qty;  // overwrite
    }
}
// otherwise p1 didn't exist and was inserted
//尝试插入
std::pair result=s1.插入(p1);
if(result.first)//插入不起作用,因为元素已经存在
{
价格水平和温度=*(结果秒);
如果(温度未采样!=p1未采样)
{
临时数量+=p1.qty;//总和
}
其他的
{
临时数量=p1.qty;//覆盖
}
}
//否则p1不存在并已插入

那么您当前的代码有什么问题?我当前的代码在语法上没有问题。如果ISimpliced不同且价格相同,它不会考虑合并两个数量。基本上,如果价格相同,但ISimpliced字段不同,即一个为真,另一个为假,我希望合并数量。您将看到什么我们要做的是首先查找价格。如果价格不存在,则插入它。如果它确实存在,则比较isImplied值以确定要做什么。问题-如果isImplied相同,会发生什么?如果isImplied相同,则应覆盖新的价格和数量。而不是测试
find()
插入
,您可以直接测试
插入
@Jarod42是的,请看我的答案:)不,这只是一个代码片段,用于说明。如果有错误,请道歉。您不能覆盖
集合
中的任何内容,因为它只提供
常量
访问。您必须删除并替换它。它不清楚,但您可以似乎在试图说明相反的观点……请不要简单地删除答案,而是编辑它以消除这种混淆。OP只有价格作为“关键”,如果你愿意的话。课程中的所有其他内容都不参与“关键”,因此可以更新。我只更新了“非关键”成员变量。检查find的签名-其中一个重载返回一个迭代器,而不是常量迭代器。@Anomail检查此项