簡體   English   中英

在一個成員變量上合並std :: set

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM