-2

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

这背后的机制是什么?

4

1 回答 1

1

如果通过 获得最高值auto & m = queue.top();,则输出也是3 2 1

尽管它m在第一次pop()调用之后调用未定义的行为以使用,但下一个值很可能被移动到该悬空引用(地址)。这是因为默认的底层类型std::priority_queueis std::vector,它保证了一个连续的元素数组。

但如前所述,行为是未定义的,并且无法保证使用不同的编译器重现该结果。

而如果通过 获得最高值auto m = queue.top();,则输出为3 3 3

from 的值top被存储m一次,之后永远不会改变。

于 2016-11-12T12:34:06.620 回答