Почему возвращаемое значение top() изменяется после вызова pop()?
Ссылка const, возвращаемая priority_queue
"s top()
меняется после звонка pop()
(визуальная студия 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
,
Какой механизм стоит за этим?
1 ответ
Если получить максимальное значение по
auto & m = queue.top();
, то вывод тоже3 2 1
,
Несмотря на это вызывает неопределенное поведение, чтобы использовать m
после 1-го pop()
вызов, вполне вероятно, что следующее значение перемещается в эту висячую ссылку (адрес). Это потому, что базовый тип по умолчанию std::priority_queue
является std::vector
, что гарантирует непрерывный массив элементов.
Но, как уже упоминалось, поведение не определено, и нет никаких гарантий воспроизвести этот результат с другим компилятором.
Хотя, если получить максимальное значение по
auto m = queue.top();
тогда вывод3 3 3
,
Значение из top
хранится в m
один раз и никогда не менялся потом.