Вызывает ли управление кучей в очереди с приоритетом stl конструктор копирования?

Я знаю, что очередь приоритетов STL использует make_heap, push_heap, а также pop_heap управлять базовым контейнером stl (вектором, например).

Вызываются ли конструкторы копирования элементов при перемещении элементов во время make_heap, push_heap, а также pop_heap звонки?

2

Решение

Согласно стандарту, push_heap а также make_heap требуется тип значения (*iterator) быть MoveAssignable а также MoveConstructible; pop_heap а также sort_heap также требуют, чтобы тип итератора был ValueSwappable, что требует swap работать, что также требует, чтобы тип значения был MoveAssignable а также MoveConstructible,

Моя интерпретация заключается в том, что стандартная библиотека может вызывать только те операции, которые могут быть удовлетворены семантикой перемещения, что можно проверить, попробовав ее на контейнере, конструктор копирования типа значения и оператор назначения копирования которого были удалены.

В качестве быстрой проверки я попробовал функции кучи для типа данных, конструктор перемещения и оператор назначения перемещения которого были удалены. И gcc 4.7.2, и clang 3.2 генерировали ошибки во время компиляции, жалуясь на то, что операции перемещения были удалены. Тест с удаленными операциями копирования скомпилирован просто отлично.

4

Другие решения

Я проверил мою реализацию. Он использует только конструкторы перемещения и назначения перемещений. Поскольку базовый тип является типичным вектором или декой, я не вижу, как вы можете добиться большего.

Вы можете проверить себя, создав фиктивный класс с одним int (необходимым для сопоставления объектов) и поместив операторы print в конструктор по умолчанию, конструктор копирования, конструктор перемещения, оператор присваивания копии и оператор присваивания перемещения.

2

Несмотря на то, что это зависит от реализации, наиболее разумные реализации будут использовать std :: swap для перемещения элементов, что позволяет избежать затрат на копирование.

-1
По вопросам рекламы [email protected]