web-dev-qa-db-ja.com

std :: vector :: swapメソッドを使用して、C ++で2つの異なるベクトルを交換しても安全ですか?

次のコードがあるとします。

_#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> First{"example", "second" , "C++" , "Hello world" };
    std::vector<std::string> Second{"Hello"};

    First.swap(Second);

    for(auto a : Second) std::cout << a << "\n";
    return 0;
}
_

ベクトルが_std::string_ではなく、クラスであると想像してください。

_std::vector<Widget> WidgetVector;

std::vector<Widget2> Widget2Vector;
_

_std::vector::swap_メソッド:WidgetVector.swap(Widget2Vector);で2つのベクトルを交換しても安全ですか、それともUBにつながりますか?

30

using std::swap; swap(a, b);a.swap(b);は、後者が機能する場合とまったく同じセマンティクスを持っています。少なくともどんな正気なタイプでも。その点で、すべての標準タイプは正気です。

興味深いアロケーターを使用しない限り(ステートフル、常に等しいわけではなく、コンテナースワップで伝達されないことを意味します。 _std::allocator_traits_ を参照)、2つのスワッピング _std::vector_ を参照してください■同じテンプレート引数を持つsは、3つの値(容量、サイズ、およびデータポインタ)の退屈な交換にすぎません。そして、基本的な型を交換すること、データ競合がないことは安全であり、投げることはできません。

それは規格によっても保証されています。 std::vector::swap() を参照してください。

0
Deduplicator