这是我第一次使用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
进行排序?
答案 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::greater的std::pair::operator>。