最終更新日時: 2023年12月30日 01時05分52秒 (JST)
suomesta が更新

履歴 編集

function
<vector>

# std::vector::operator=

    vector& operator=(const vector& x);           // (1) C++03
    constexpr vector& operator=(const vector& x); // (1) C++20

    vector& operator=(vector&& x);          // (2) C++11
    vector& operator=(vector&& x) noexcept(
      allocator_traits<Allocator>::propagate_on_container_move_assignment::value
        || allocator_traits<Allocator>::is_always_equal::value); // (2) C++17
    constexpr vector& operator=(vector&& x) noexcept(
      allocator_traits<Allocator>::propagate_on_container_move_assignment::value
        || allocator_traits<Allocator>::is_always_equal::value); // (2) C++20

    vector& operator=(initializer_list<T> init);           // (3) C++11
    constexpr vector& operator=(initializer_list<T> init); // (3) C++20

## 概要

- (1) : コピー代入
- (2) : ムーブ代入
- (3) : 初期化子リストの代入

## テンプレートパラメータ制約

- (1), (3) : 型`T`が`vector`に対してコピー挿入可能であること

## 効果

- (1) : 同じテンプレートパラメータを持つ`vector`クラスのオブジェクトをコピー代入する。`*this`の全ての要素が解放され、`x`の全ての要素が`*this`にコピーされる。
- (2) : 同じテンプレートパラメータを持つ`vector`クラスのオブジェクトをムーブ代入する。`*this`の全ての要素が解放され、`x`の全ての要素が`*this`にムーブされる。
- (3) : 同じテンプレートパラメータを持つ`initializer_list`クラスのオブジェクトをコピー代入する。`*this`の全ての要素が解放され、`init`の全ての要素が`*this`にコピーされる。

## 戻り値

`*this`

## 事後条件

- (1) : `*this == x`
- (2) : `*this`は元々の`x`と等値となる
- (3) : `*this == vector{init}`

## 計算量

- (1) : 全要素のデストラクタ呼び出しとコピーを行うために、線形時間
- (2) : 全要素のデストラクタ呼び出しをするために、線形時間
- (3) : 全要素のデストラクタ呼び出しとコピーを行うために、線形時間

## 例

    #include <cassert>
    #include <vector>
    #include <algorithm>
    #include <utility>

    int main()
    {
      // コピー代入
      {
        std::vector<int> v1 = {1, 2, 3};
        std::vector<int> v2;

        v2 = v1;

        assert(v1 == v2);
      }

      // ムーブ代入
      {
        std::vector<int> v1 = {1, 2, 3};
        std::vector<int> v2;

        std::vector<int> copied_v1 = v1;
        v2 = std::move(v1);

        assert(copied_v1 == v2);
      }

      // 初期化子リストからのコピー代入
      {
        std::vector<int> v1;
        v1 = {1, 2, 3};

        // 事後条件の検証:
        std::initializer_list<int> init = {1, 2, 3};
        std::vector<int> v2;
        v2 = init;

        assert(v2.size() == init.size());
        assert(std::equal(v2.begin(), v2.end(), init.begin()));
      }
    }

### 出力

## 参照

- N2679 Initializer Lists for Standard Containers(Revision 1)
  - (3)の経緯となる提案文書
- N4258 Cleaning-up noexcept in the Library, Rev 3
  - `noexcept` 追加の経緯となる提案文書
- P1004R2 Making `std::vector` constexpr