2

stl プライオリティ キューがmake_heappush_heap、およびを使用pop_heapして、基礎となる stl コンテナー (ベクトルなど) を管理することを知っています。

make_heappush_heap、およびpop_heap呼び出し中に要素を移動するときに、要素のコピー コンストラクターが呼び出されていますか?

4

3 に答える 3

4

標準によると、値の型 ( ) は and である必要がpush_heapあります。また、反復子の型がである必要があり、これは機能する必要があり、値の型もandである必要があります。make_heap*iteratorMoveAssignableMoveConstructiblepop_heapsort_heapValueSwappableswapMoveAssignableMoveConstructible

私の解釈では、標準ライブラリは、値型のコピー コンストラクターとコピー代入演算子が削除されたコンテナーで試してみることで、移動セマンティクスを満たすことができる操作のみを呼び出すことができます。

簡単な検証として、move コンストラクターと move 代入演算子が削除されたデータ型でヒープ関数を試してみました。gcc 4.7.2 と clang 3.2 の両方で、移動操作が削除されたことを示すコンパイル時エラーが発生しました。コピー操作を削除したテストは問題なくコンパイルされました。

于 2012-11-26T15:57:59.443 に答える
2

実装をテストしました。移動コンストラクターと移動割り当てのみを使用します。基になる型は典型的なベクトルまたは両端キューであるため、これ以上の方法がわかりません。

1つのint(オブジェクトの比較に必要)を使用してダミークラスを作成し、デフォルトのコンストラクター、コピーコンストラクター、移動コンストラクター、コピー代入演算子、および移動代入演算子にprintステートメントを配置することでテストできます。

于 2012-11-26T05:28:41.913 に答える
-1

これは実装に依存しますが、最も賢明な実装では std::swap を使用して要素を移動し、コピーのオーバーヘッドを回避します。

于 2012-11-26T05:01:07.850 に答える