2

我知道 stl 优先级队列使用make_heappush_heappop_heap来管理底层 stl 容器(例如向量)。

make_heap在、push_heap和调用期间移动元素时是否调用了元素的复制构造函数pop_heap

4

3 回答 3

4

根据标准,push_heap要求make_heap值类型(*iterator)为MoveAssignableand MoveConstructiblepop_heap并且sort_heap还要求迭代器类型是ValueSwappable,这需要swap工作,这也要求值类型是MoveAssignableand MoveConstructible

我的解释是标准库只能调用可以满足移动语义的操作,可以通过在其值类型的复制构造函数和复制赋值运算符已被删除的容器上尝试它来进行测试。

通过快速验证,我在删除了移动构造函数和移动赋值运算符的数据类型上尝试了堆函数。gcc 4.7.2 和 clang 3.2 都产生了编译时错误,抱怨移动操作被删除。删除复制操作的测试编译得很好。

于 2012-11-26T15:57:59.443 回答
2

我测试了我的实现。它只使用移动构造函数和移动赋值。由于底层类型是典型的向量或双端队列,我看不出你能做得更好。

您可以通过创建一个只有一个 int(比较对象所需)的虚拟类并将打印语句放入默认构造函数、复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符来测试自己。

于 2012-11-26T05:28:41.913 回答
-1

尽管这是依赖于实现的,但大多数明智的实现将使用 std::swap 来移动元素,从而避免复制开销。

于 2012-11-26T05:01:07.850 回答