为什么在调用 pop() 后 top() 的 return 值发生变化?
Why does top()'s return value change after calling pop()?
priority_queue
的 top()
返回的 const 引用在调用 pop()
后发生变化(visual studio 2015)
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();
获得最高值,则输出为 3 3 3
。
这背后的机制是什么?
If get top value by auto & m = queue.top();
, then output is also 3 2 1
.
尽管它在第一次 pop()
调用后调用未定义的行为来使用 m
,下一个值很可能被移动到那个悬空引用(地址)。这是因为 std::priority_queue
的默认基础类型是 std::vector
,它保证了元素数组的连续性。
但是如前所述,行为是未定义的,并且不能保证使用不同的编译器重现该结果。
While if get top value by auto m = queue.top();
, then output is 3 3 3
.
来自 top
的值只存储到 m
一次,之后就再也没有改变过。
priority_queue
的 top()
返回的 const 引用在调用 pop()
后发生变化(visual studio 2015)
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();
获得最高值,则输出为 3 3 3
。
这背后的机制是什么?
If get top value by
auto & m = queue.top();
, then output is also3 2 1
.
尽管它在第一次 pop()
调用后调用未定义的行为来使用 m
,下一个值很可能被移动到那个悬空引用(地址)。这是因为 std::priority_queue
的默认基础类型是 std::vector
,它保证了元素数组的连续性。
但是如前所述,行为是未定义的,并且不能保证使用不同的编译器重现该结果。
While if get top value by
auto m = queue.top();
, then output is3 3 3
.
来自 top
的值只存储到 m
一次,之后就再也没有改变过。