2016-01-10 7 views
6

私は今のところコピー不可能なクラスDataを持っています。 std::sortstd::vector<Data>は、Dataの移動コンストラクタと移動割り当てが定義されているために機能します。私はクラスが内部にたくさんのデータを持っていて、内容をコピーするのが遅すぎるので、この方法で行います。しかし、私は今、無関係の理由で、コピーコンストラクタData(const Data& other)と標準代入演算子()をクラスに追加することを検討しています。 Dataのベクトルを並べ替えると、std::sortは引き続き移動コンストラクタと移動割り当てを使用することができますか?std :: sortにmoveコンストラクタとmove-assignmentを使用させるには?

+2

ための移動-コンストラクタ、移動割り当てと(同じ名前空間で)自由swap -functionを提供し、あなたはそれを試してみましたか?あなたは結果に驚くかもしれません。 –

+1

も参照してください:http://stackoverflow.com/questions/14212701/stdsort-does-not-always-call-stdswap –

+5

クラスをコピー可能かつ移動可能にする場合は、移動コンストラクタ 'noexcept'を宣言する必要がありますそれです)。 'sort'パフォーマンスには影響しませんが、強い例外保証のために' vector'に要素を追加するときに違いがあります。 – Praetorian

答えて

1

は、どのように私は、データのベクトルを並べ替えるとき、の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); 
} 

だから、チャンスは、あなたが特別なことをする必要はありませんされています。

+3

'sort'は' swap'だけを使用するよう指定されていません。実際の実装を見ると、移動コンストラクタと割り当ての移動も使用されます。 –

+1

@MarcGlisse、おそらく正しいと私は思う実装に依存します。どちらの場合でも、OPは心配する必要はありません。 – alfC

2

はちょうどあなたのDataクラス

関連する問題