問題タブ [copy-and-swap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 代入演算子を使用するときにコピーとスワップを使用するのはなぜですか?
コピー アンド スワップ方式を使用する場合の代入演算子について質問があります。
すべてのポインターと動的に割り当てられた変数をディープコピーする優れたコピー コンストラクターがあるとします。
では、上のコードと下のコードの違いは何ですか?
良いコピー コンストラクターがあるので、別のオブジェクト s が operator= 関数内に作成されると思います。では、スローしないスワップ関数を使用するポイントは何ですか?
c++ - テンプレートクラスのフレンド関数のリンクエラー
テンプレートクラスノードがあり、コピーアンドスワップイディオムに従うために、クラスのswap
関数を記述しようとしていますfriend
Node
私のコードは:
Node.h
そしてそのNode.tpp
私がそれをテストするときSource.cpp
次のリンク エラーが表示されます。
c++ - 4 (半分) のルールとは何ですか?
オブジェクトのコピーを適切に処理するための経験則は、Rule of Threeです。C++11 では、ムーブ セマンティクスが問題になるため、代わりにRule of Five を使用します。ただし、ここやインターネットでの議論では、Rule of Five と copy-and-swap のイディオムを組み合わせたRule of Four (and a half)への言及も見ました。
では、4 (半) のルールとは正確には何ですか? どの関数を実装する必要があり、各関数の本体はどのように見えるべきですか? 半分はどの機能ですか?ルール・オブ・ファイブと比較して、このアプローチの欠点や警告はありますか?
これは、私の現在のコードに似た参照実装です。これが正しくない場合、正しい実装はどのようになりますか?
c++ - これらのオブジェクトに適用されたとき、`std::swap` は何をしますか?
コード
期待通りの出力
cplusplus.com から > std::swap下の複雑さ
非配列:定数: 1 つの構成と 2 つの代入を正確に実行します (ただし、これらの操作はそれぞれ独自の複雑さで機能することに注意してください)。
Array: Linear in N: 要素ごとにスワップ操作を実行します。
std::swap
に適用されa1
、a2
ポインターを配列にスワップするだけで、[1,2,3]
他[11,12,13]
のものはコピーしないということint
ですか?
std::swap
class の 2 つのオブジェクトに適用すると、正確にはどうなりA
ますか?
std::swap
配列のすべての要素をコピーすると仮定すると、時間の複雑さが一定であるstatic A::swap
関数を作成する必要があります ( cplusplus.com > vector::swapから)。つまり、ポインターのみをスワップしますか?vector::swap
std::swap
[..] のセマンティクスがC++17 で変更されたというメモを追加したい。そのため、コンパイラ、そのバージョン、および対象とする標準について言及することをお勧めします。
単純に見える質問が、C++ 標準とコンパイラのバージョンに関する複雑さをもたらさないことを願っていました。通常、コードは C++11 でコンパイルします。完全を期すために、ここに私のラップトップの gcc バージョンを示します。
c++ - コピースワップイディオムはお勧めしませんか?
長い間、コピー割り当てを実装する正しい方法 (重要なクラスの場合) は、コピー スワップ イディオムを使用することだと考えていました。
しかし、その後、Howard Hinnant によるこの講演https://www.youtube.com/watch?v=vLinb2fgkHkを聞きました。彼は、copy-swap イディオムは強い例外の保証を満たすのに適しているが、一般的にはやり過ぎだと言っています。
彼はここでそれについて言及しています:https://youtu.be/vLinb2fgkHk?t=2616
そこで彼は、コピー割り当てを明示的に実装し、コピーstrong_assing(A& target, A const& source)
スワップを含む別の関数を用意することを提案しています。
私が理解していないのは、どのA& operator=(A const& other)
ように実装する必要があるのですか?
彼はこのようなものを持っていることを提案していますか?
これはstd::vector
実装が行うことですか?つまり、彼らは最後にコピースワップイディオムを使用しないのですか? 標準ベクトルには強力な例外保証が必要ではありませんか?