【问题标题】:Inserting into STL Set of pair by sorting by second if first is same如果第一个相同,则通过按第二个排序插入 STL 对集合
【发布时间】:2012-12-02 10:52:43
【问题描述】:

我有一个

pair<int, pair<int, string> >. 

现在,我将其插入到 C++ 的 STL 集中。它保持集合按第一个值排序。但是,如果我插入一对与其他值相同的第一个值,我希望根据第二个值根据较大的第一个值对其进行排序。我举个例子说明清楚。

#define pii pair<int, string>
#define pint pair< int , pii >
set< pint > S;
set< pint >::iterator it;
S.insert(make_pair(100, make_pair(1, "hi")));
S.insert(make_pair(50, make_pair(2, "hello")));
it = S.begin();
cout << it->second.second;

我得到的输出是

hello

但是,如果我现在这样做,

S.insert(make_pair(50, make_pair(3, "dude")));
it = S.begin();
cout << it->second.second

这里的输出也是

hello

但我希望输出是

dude

因为它的第一个值(50)小于“hi”的第一个值(100)并且等于“hello”的第一个值(50)。但是,它的第二个值(3)大于“hi”的第二个值(1),也大于“hello”的第二个值。

谢谢。

因此,如果第一个值相同,那么它必须根据第二个值排序,但首先是较大的第二个值。

【问题讨论】:

  • 所以只需创建您自己的operator&lt;,以这种方式比较它们。
  • 我像 ideone.com/ya1nrg 一样更改了它,但它没有帮助。它返回“x”,我希望它是“y”。
  • 见 Ruud v A 的回答。您必须告诉set 使用您的比较运算符,方法是将其包装在一个类中。 ideone.com/AQfmO1

标签: c++ stl set


【解决方案1】:

如您所见,set 的定义允许您指定比较操作

template < class Key, class Compare = less<Key>,
       class Allocator = allocator<Key> > class set;

Compare 可以是一个具有 operator() 进行比较的类。此运算符有两个值,如果要在集合中将第一个放在第二个之前,则需要返回 true

【讨论】:

  • 您必须将比较运算符包装在一个类中,然后告诉集合使用它。见ideone.com/AQfmO1
  • 谢谢!我也让它工作,但你的代码是如此干净和可重用。 ideone.com/ya1nrg再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 2022-01-04
  • 1970-01-01
  • 2017-06-17
  • 2022-02-12
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多