调用priority_queue
后,top()
的{{1}}返回的const引用发生了变化(visual studio 2015)
pop()
如果按priority_queue<int> queue;
queue.push(1);
queue.push(2);
queue.push(3);
const int & m = queue.top();
cout << m << endl; // 3
queue.pop();
cout << m << endl; // 2
queue.pop();
cout << m << endl; // 1
获得最高值,则输出也为auto & m = queue.top();
。
如果按3 2 1
获得最高值,则输出为auto m = queue.top();
。
这背后有什么机制?
答案 0 :(得分:1)
如果按
auto & m = queue.top();
获得最高值,则输出也为3 2 1
。
尽管在第一次m
调用之后调用未定义的行为以使用pop()
,但很可能将下一个值移动到该悬空引用(地址)。这是因为std::priority_queue
的默认底层类型是std::vector
,它保证了连续的元素数组。
但是如前所述,行为未定义,并且无法保证使用不同的编译器重现该结果。
如果按
auto m = queue.top();
获得最高值,则输出为3 3 3
。
top
的值会被存储到m
一次,之后就不会更改。