問題タブ [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.

0 投票する
3 に答える
95 参照

c++ - 代入演算子を使用するときにコピーとスワップを使用するのはなぜですか?

コピー アンド スワップ方式を使用する場合の代入演算子について質問があります。

すべてのポインターと動的に割り当てられた変数をディープコピーする優れたコピー コンストラクターがあるとします。

では、上のコードと下のコードの違いは何ですか?

良いコピー コンストラクターがあるので、別のオブジェクト s が operator= 関数内に作成されると思います。では、スローしないスワップ関数を使用するポイントは何ですか?

0 投票する
1 に答える
340 参照

c++ - テンプレートクラスのフレンド関数のリンクエラー

テンプレートクラスノードがあり、コピーアンドスワップイディオムに従うために、クラスのswap関数を記述しようとしていますfriendNode

私のコードは:

Node.h

そしてそのNode.tpp

私がそれをテストするときSource.cpp

次のリンク エラーが表示されます。

0 投票する
3 に答える
4098 参照

c++ - 4 (半分) のルールとは何ですか?

オブジェクトのコピーを適切に処理するための経験則は、Rule of Threeです。C++11 では、ムーブ セマンティクスが問題になるため、代わりにRule of Five を使用します。ただし、ここやインターネットでの議論では、Rule of Five と copy-and-swap のイディオムを組み合わせたRule of Four (and a half)への言及も見ました。

では、4 (半) のルールとは正確には何ですか? どの関数を実装する必要があり、各関数の本体はどのように見えるべきですか? 半分はどの機能ですか?ルール・オブ・ファイブと比較して、このアプローチの欠点や警告はありますか?

これは、私の現在のコードに似た参照実装です。これが正しくない場合、正しい実装はどのようになりますか?

0 投票する
2 に答える
900 参照

c++ - これらのオブジェクトに適用されたとき、`std::swap` は何をしますか?

コード

期待通りの出力

cplusplus.com から > std::swap下の複雑さ

非配列:定数: 1 つの構成と 2 つの代入を正確に実行します (ただし、これらの操作はそれぞれ独自の複雑さで機能することに注意してください)。

Array: Linear in N: 要素ごとにスワップ操作を実行します。

std::swapに適用されa1a2ポインターを配列にスワップするだけで、[1,2,3][11,12,13]のものはコピーしないということintですか?

std::swapclass の 2 つのオブジェクトに適用すると、正確にはどうなりAますか?

std::swap配列のすべての要素をコピーすると仮定すると、時間の複雑さが一定であるstatic A::swap関数を作成する必要があります ( cplusplus.com > vector::swapから)。つまり、ポインターのみをスワップしますか?vector::swap


std::swap[..] のセマンティクスがC++17 で変更されたというメモを追加したい。そのため、コンパイラ、そのバージョン、および対象とする標準について言及することをお勧めします。

単純に見える質問が、C++ 標準とコンパイラのバージョンに関する複雑さをもたらさないことを願っていました。通常、コードは C++11 でコンパイルします。完全を期すために、ここに私のラップトップの gcc バージョンを示します。

0 投票する
0 に答える
106 参照

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実装が行うことですか?つまり、彼らは最後にコピースワップイディオムを使用しないのですか? 標準ベクトルには強力な例外保証が必要ではありませんか?