对对排序STL容器

时间:2019-04-12 14:31:42

标签: c++ c++11 stl

这是我第一次使用C ++ STL priority_queue(),对于我遇到的这段特定代码我有些困惑(但是我相信这与pq无关,它应该适用于所有容器(向量,集合等):

priority_queue<pair<int, pair<int, int> >,
            vector<pair<int, pair<int, int> > >,
            greater<pair<int, pair<int, int> > > > pq;

让我们说我有pq.push_back(make_pair(a,make_pair(b,c)))。如果存在a冲突,那么比较规则是否会扩展到第二对,并且将基于b然后基于c进行排序?

4 个答案:

答案 0 :(得分:2)

问题基本上可以归结为:std::pair的排序方式,即两对a > b的结果是什么(请注意std::greater仅调用operator>) 。

std::pair::operator>的{​​{3}}开始:

  

按字典顺序比较lhs和rhs,即比较第一个   元素,并且仅当它们相等时,才比较第二个   元素。

这自然扩展到嵌套对。因此...

  

假设我有pq.push_back(make_pair(a,make_pair(b,c)))。如果   如果存在冲突,则比较规则将扩展到   第二对和排序将在b的基础上进行,然后在c的基础上进行?

是的。如果两个元素具有相等的a,则将比较最外面的一对second中的(b,c)

答案 1 :(得分:1)

  

如果存在a冲突,那么比较规则是否会扩展到第二对,并基于b然后c进行排序?

完全正确。 std::greater默认为operator >,如果为std::pair,则implements lexicographical comparison为{{3}}-即比较第一个,如果第一个一致,则比较第二个。

答案 2 :(得分:0)

priority_queue需要比较方法。默认情况下,将使用std::less,但您可以覆盖它。

使用std::pair意味着使用std :: pair:http://www.cplusplus.com/reference/utility/pair/operators/

使用的默认比较。

我认为这应该可以回答您的问题。

答案 3 :(得分:0)

您是正确的:成对的配对按(a,b,c)的字典顺序排序。 看一下实际上称为std::greaterstd::pair::operator>