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
呼び出し中に要素を移動するときに、要素のコピー コンストラクターが呼び出されていますか?
標準によると、値の型 ( ) は and である必要がpush_heap
あります。また、反復子の型がである必要があり、これは機能する必要があり、値の型もandである必要があります。make_heap
*iterator
MoveAssignable
MoveConstructible
pop_heap
sort_heap
ValueSwappable
swap
MoveAssignable
MoveConstructible
私の解釈では、標準ライブラリは、値型のコピー コンストラクターとコピー代入演算子が削除されたコンテナーで試してみることで、移動セマンティクスを満たすことができる操作のみを呼び出すことができます。
簡単な検証として、move コンストラクターと move 代入演算子が削除されたデータ型でヒープ関数を試してみました。gcc 4.7.2 と clang 3.2 の両方で、移動操作が削除されたことを示すコンパイル時エラーが発生しました。コピー操作を削除したテストは問題なくコンパイルされました。
実装をテストしました。移動コンストラクターと移動割り当てのみを使用します。基になる型は典型的なベクトルまたは両端キューであるため、これ以上の方法がわかりません。
1つのint(オブジェクトの比較に必要)を使用してダミークラスを作成し、デフォルトのコンストラクター、コピーコンストラクター、移動コンストラクター、コピー代入演算子、および移動代入演算子にprintステートメントを配置することでテストできます。
これは実装に依存しますが、最も賢明な実装では std::swap を使用して要素を移動し、コピーのオーバーヘッドを回避します。