最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<vector>

# std::vector::emplace_back(C++11)

    template <class... Args>
    void emplace_back(Args&&... args);                      // (1) C++11
    template <class... Args>
    reference emplace_back(Args&&... args);                 // (1) C++17
    template <class... Args>
    constexpr reference emplace_back(Args&&... args);       // (1) C++20

    template <class... Args>
    void vector<bool>::emplace_back(Args&&... args);                // (2) C++11
    template <class... Args>
    reference vector<bool>::emplace_back(Args&&... args);           // (2) C++17
    template <class... Args>
    constexpr reference vector<bool>::emplace_back(Args&&... args); // (2) C++20

## 概要

直接構築で新たな要素を末尾に追加する。

この関数の引数 `args...` は、要素型 `value_type` のコンストラクタ引数である。当関数の内部で要素型 `value_type` のコンストラクタを呼び出し、追加する要素を構築する。

## 戻り値

- C++14 まで：なし
- C++17 から：構築した要素への参照

## 計算量

償却定数時間。

この関数を呼び出す前に`size() < capacity()`であった場合、この関数の実行は定数時間で行われる。そうでない場合は、メモリ領域の再確保と、その領域への要素のコピーもしくはムーブが行われるため、線形時間で実行される。

`vector`の実装で行われるメモリ確保戦略では、再確保の際にそれら要素がぴったり収まるサイズを確保するのではなく、少し多めの1.5倍や2倍といったサイズのメモリを確保し、再確保の回数を減らしている。事前に追加する要素の数がわかっている場合には`reserve()`メンバ関数で事前にその要素数分のメモリを確保し、そうでない場合には`vector`のメモリ確保戦略に任せるのがよいだろう。

## 備考

- 再確保の可能性、イテレータの有効性への影響、例外発生時に副作用が発生しない保証はいずれも`push_back()`と同様。

## 例

    #include <iostream>
    #include <vector>
    #include <utility>
    #include <string>
    #include <algorithm>

    int main()
    {
      std::vector<std::pair<int, std::string>> v;

      v.emplace_back(3, std::string("hello"));
      v.push_back(std::make_pair(1, std::string("world")));

      std::for_each(v.begin(), v.end(), [](decltype(v)::const_reference x) {
        std::cout << x.first << ',' << x.second << std::endl;
      });
    }

### 出力

    3,hello
    1,world

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2013 ✅

## 参照

- N2680 Proposed Wording for Placement Insert (Revision 1)
- LWG Issue 2187. `vector<bool>` is missing emplace and `emplace_back` member functions
- LWG Issue 2252. Strong guarantee on `vector::push_back()` still broken with C++11?
  - 経緯の説明は、`vector::push_back()`ページを参照。
- P0084R0 Emplace Return Type
- P0084R1 Emplace Return Type (Revision 1)
- P0084R2 Emplace Return Type (Revision 2)
- P1004R2 Making `std::vector` constexpr