5

例えば:

set<int> s1;
set<int> s2;
s1.insert(1);
s2.insert(2);
s1 = s2;

安全ですか?もしそうなら、古い要素(およびそれらが発生した記憶)はどこに来たのですか?

4

4 に答える 4

6

はい、割り当てを行うのは安全です。コピー コンストラクターまたは代入演算子が呼び出され、古い要素が消去さs1れ、 の要素に置き換えられs2ます。

[注: 潜在的な問題があった場合、コピー コンストラクターと代入は , , のようfstreamofstream禁止されていifstreamました。]

于 2012-06-20T16:13:18.243 に答える
5

はい。古い要素は通常の方法で破棄され、メモリは解放されます。(もちろん、コンテナにポインタを格納すると、ポインタが破棄されるだけで、ポインタが指すものは解放されません)

于 2012-06-20T16:13:12.453 に答える
4

はい、あなたの例は安全です。ただし、注意: s2 を s1 に割り当てるのではなく、s2 を s1 にコピーします。詳細については、これを参照してください: set::operator=

于 2012-06-20T16:12:53.250 に答える
1

割り当ては安全です。

代入演算子は、デストラクタ(この例ではintの簡単なno-op)を呼び出すことにより、s1に元々含まれていたオブジェクトを破棄します。セットがメモリも解放するか、後で追加される要素で使用するために初期化されていないメモリとして保持するかは、実装次第です。

s1の新しいオブジェクトはs2のオブジェクトからコピーされますが、これにはかなりの時間がかかる場合があります。割り当て後にs2を保持したくない場合は、2つのコンテナーを交換するか、C++11の移動割り当てを使用することをお勧めします。

std::swap(s1, s2);  // Backwards-compatible swap
s1 = std::move(s2); // C++11 rvalue move assignment

これらは両方とも、おそらく1つのポインターを交換するだけで、保持したいコンテンツをs1に残し、残りをs2に残して、s2がスコープ外になったときにクリアされます。

于 2012-06-20T18:39:21.520 に答える