C ++中多对偶的奇怪行为

问题描述 投票:0回答:1

使用Cmp,我正在按对的第二个值对多集进行排序。

问题1:我没有使用set,因为我无法同时存储{5,3}和{6,3},而且由于它们不同,我也不知道为什么。

using pair_type = std::pair<int, int>;

struct Cmp
{
    bool operator()(const pair_type& v1, const pair_type& v2) const
    { 
        return v1.second < v2.second; 
    }
};

int main()
{
multiset<pair_type,Cmp> m;

    m.insert({1,1});
    m.insert({2,1});
    m.insert({3,2});
    m.insert({4,2});
    m.insert({5,3});
    m.insert({6,3});

    auto itr = m.find({6,3});

    m.erase(itr);
}

问题2:同样,m.erase擦除{5,3}而不是{6,3},即擦除具有相同第二个值的第一对。实际上m.find({6,3})返回{5,3} 。什么原因造成的,以及如何解决这两个问题?

c++ stl set multiset
1个回答
0
投票

您明确地仅将cmp中的second参数对进行比较:

 return v1.second < v2.second;

您需要同时比较两者:

 return v1 < v2;

如果您不这样做,那么查找将找到您所看到的任何值为{xxx,3}的项目。如果进行此更改,则可以使用集合,因为值将有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.