[英]merge std::set on one member variable
我的要求是,如果價格相同但被隱含的布爾值不同,則要合並兩個集合的數量。
電流輸出:
價格:100現價:0數量:10
價格:200現價:0數量:20
由於價格100和200已經存在於集合中,因此將忽略p3和p4的插入。
所需的輸出:
價格:100 IsImplied:0數量:40(10 + 30)(由於P1和P3具有相同的價格,但isImpplied值不同,所以數量合並)
價格:200 IsImplied:0數量:60(20 + 40)(數量合並,因為P2和P4具有相同的價格,但isImpplied值不同)
class PriceLevel
{
public:
int price;
int qty;
bool isImplied;
PriceLevel(int _price, int _qty, bool _isImplied)
{
price = _price;
qty = _qty;
isImplied = _isImplied;
}
friend bool operator<(const PriceLevel &p, const PriceLevel &q);
};
bool operator<(const PriceLevel &p, const PriceLevel &q)
{
if(p.price < q.price)
{
return true;
}
else
{
return false;
}
}
int main()
{
std::set<PriceLevel> s1;
PriceLevel p1(100,10, false);
PriceLevel p2(200,20, false);
PriceLevel p3(100,30, true);
PriceLevel p4(200,40, true);
s1.insert(p1);
s1.insert(p2);
s1.insert(p3);
s1.insert(p4);
set<PriceLevel>::iterator it = s1.begin();
for(; it != s1.end(); it++)
{
cout << "Price: " << it->price << endl;
cout << "Qty : " << it->qty << endl;
cout << "IsImplied: " << it->isImplied << endl;
}
}
如果還需要保留數量,則比較功能應使用該信息。 集合比較適用於嚴格的弱排序。 有兩種方法可以實現此目的。 選擇一個最適合您的設計。
保持一組PriceLevel本身的1.Instead,保持地圖與關鍵的價格和價值的數量。 您的更新功能將類似於:
void update(map<int, int> &valueMap, const PriceList &val)
{
valueMap[val.price] += val.qty;
}
`2.修改集合中的插入邏輯。 更新如下所示:
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);
}
很明顯,您的比較功能需要更新以說明數量。 它看起來應該像
bool comp(const PriceList& val1, const PriceList& val2)
{
return make_pair(val1.price, val1.qty) < make_pair(val2.price, val2.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.