私は今のところコピー不可能なクラスData
を持っています。 std::sort
のstd::vector<Data>
は、Data
の移動コンストラクタと移動割り当てが定義されているために機能します。私はクラスが内部にたくさんのデータを持っていて、内容をコピーするのが遅すぎるので、この方法で行います。しかし、私は今、無関係の理由で、コピーコンストラクタData(const Data& other)
と標準代入演算子()をクラスに追加することを検討しています。 Data
のベクトルを並べ替えると、std::sort
は引き続き移動コンストラクタと移動割り当てを使用することができますか?std :: sortにmoveコンストラクタとmove-assignmentを使用させるには?
答えて
は、どのように私は、データのベクトルを並べ替えるとき、のstd ::ソート はまだ移動-コンストラクタを使用し、移動割り当てをすることを確認することができますか?
実際、必要はありません。 swap
関数が、移動コンストラクタですでに使用されているトリックを直接的または間接的に利用することを確認する必要があります。それはどういう仕組みかと思います。つまり、sort
にはスワップが必要で、必ずしもコピーである必要はありません。
ここで、「直接」とは、できる限り移動コンストラクタを使用するデフォルトのstd::swap
を単に使用することを意味します。 swap
(または@MarcGlisseが直接、ソートアルゴリズムを述べたように)移動コンストラクタを使用しますので、
template <class T> void swap (T& a, T& b)
{
T c(std::move(a)); a=std::move(b); b=std::move(c);
}
だから、チャンスは、あなたが特別なことをする必要はありませんされています。
'sort'は' swap'だけを使用するよう指定されていません。実際の実装を見ると、移動コンストラクタと割り当ての移動も使用されます。 –
@MarcGlisse、おそらく正しいと私は思う実装に依存します。どちらの場合でも、OPは心配する必要はありません。 – alfC
はちょうどあなたのData
クラス
- 1. std :: thread moveコンストラクタ
- 2. std :: moveを文字列に使用する場所は?
- 3. std :: moveを使用し、データの使用をさらに防止する
- 4. rvalue refsとstd :: move
- 5. std :: moveを使って
- 6. std :: move Vs std :: forward
- 7. カスタムクラスを使用してstd :: sortエラー
- 8. 私はいつもコンストラクタでstd :: moveを使うべきですか?
- 9. std :: vector、std :: moveとポインタの無効化
- 10. std :: move returnステートメント
- 11. std :: promiseをスレッドに渡すには? std :: moveまたはstd :: shared_ptrによって?
- 12. std :: sortを使用すると、functor(inherrited)は禁止されていますか?
- 13. std :: unique_ptr :: release()vs std :: move()
- 14. std :: sortアルゴリズムのメモリ使用量
- 15. moveコンストラクタがコピーの代わりに返されました
- 16. 型キャストとstd :: move()の違いは?
- 17. std :: moveがstd :: listと一緒に動作しない理由
- 18. std :: move in-place operation
- 19. std :: sort from継承されたファンクタを使用
- 20. qsortとstd :: sortの比較
- 21. std :: sort without functors
- 22. コンストラクタでstd :: asyncを使用する
- 23. std :: sortを使ってstd :: arrayをソートする方法?
- 24. `std :: sort()`はスレッドを使ってパフォーマンスを向上させますか?
- 25. move ctors /代入演算子でstd :: moveまたはstd :: forwardを使うべきですか?
- 26. std :: sort by unary mapping
- 27. コンストラクタの初期化リストでstd :: moveが必要なのはなぜですか?
- 28. copy対int std :: move for ints
- 29. この場合のstd :: moveとstd :: refの相違点
- 30. std :: string nothrow move assignableまたはcomparable?
ための移動-コンストラクタ、移動割り当てと(同じ名前空間で)自由
swap
-functionを提供し、あなたはそれを試してみましたか?あなたは結果に驚くかもしれません。 –も参照してください:http://stackoverflow.com/questions/14212701/stdsort-does-not-always-call-stdswap –
クラスをコピー可能かつ移動可能にする場合は、移動コンストラクタ 'noexcept'を宣言する必要がありますそれです)。 'sort'パフォーマンスには影響しませんが、強い例外保証のために' vector'に要素を追加するときに違いがあります。 – Praetorian