我知道 stl 优先级队列使用make_heap
、push_heap
和pop_heap
来管理底层 stl 容器(例如向量)。
make_heap
在、push_heap
和调用期间移动元素时是否调用了元素的复制构造函数pop_heap
?
我知道 stl 优先级队列使用make_heap
、push_heap
和pop_heap
来管理底层 stl 容器(例如向量)。
make_heap
在、push_heap
和调用期间移动元素时是否调用了元素的复制构造函数pop_heap
?
根据标准,push_heap
要求make_heap
值类型(*iterator
)为MoveAssignable
and MoveConstructible
;pop_heap
并且sort_heap
还要求迭代器类型是ValueSwappable
,这需要swap
工作,这也要求值类型是MoveAssignable
and MoveConstructible
。
我的解释是标准库只能调用可以满足移动语义的操作,可以通过在其值类型的复制构造函数和复制赋值运算符已被删除的容器上尝试它来进行测试。
通过快速验证,我在删除了移动构造函数和移动赋值运算符的数据类型上尝试了堆函数。gcc 4.7.2 和 clang 3.2 都产生了编译时错误,抱怨移动操作被删除。删除复制操作的测试编译得很好。
我测试了我的实现。它只使用移动构造函数和移动赋值。由于底层类型是典型的向量或双端队列,我看不出你能做得更好。
您可以通过创建一个只有一个 int(比较对象所需)的虚拟类并将打印语句放入默认构造函数、复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符来测试自己。
尽管这是依赖于实现的,但大多数明智的实现将使用 std::swap 来移动元素,从而避免复制开销。