我知道stl优先级队列使用make_heap
,push_heap
和pop_heap
来管理底层的stl容器(例如,一个向量)。
在make_heap
,push_heap
和pop_heap
来电期间移动元素时,是否会调用元素的副本构造函数?
答案 0 :(得分:4)
根据标准,push_heap
和make_heap
要求值类型(*iterator
)为MoveAssignable
和MoveConstructible
; pop_heap
和sort_heap
还要求迭代器类型为ValueSwappable
,这需要swap
才能工作,这也需要值类型为MoveAssignable
和{{ 1}}。
我的解释是标准库只能调用可以满足移动语义的操作,可以通过在已删除其值类型的复制构造函数和复制赋值运算符的容器上进行测试来测试。
通过快速验证,我尝试了删除了移动构造函数和移动赋值运算符的数据类型的堆函数。 gcc 4.7.2和clang 3.2都生成了编译时错误,抱怨移动操作被删除了。已删除的复制操作的测试编译得很好。
答案 1 :(得分:2)
我测试了我的实现。它仅使用移动构造函数和移动赋值。由于底层类型是典型的向量或双端队列,我无法看到你如何做得更好。
您可以通过创建一个只有一个int(对象对象所需)的伪类来测试自己,并将print语句放在默认构造函数,复制构造函数,移动构造函数,复制赋值运算符和移动assignemt运算符中。 / p>
答案 2 :(得分:-1)
虽然这是依赖于实现的,但是大多数合理的实现都会使用std :: swap来移动元素,从而避免复制开销。