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

履歴 編集

function template
<vector>

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

    template <class... Args>
    iterator
      emplace(const_iterator position, Args&&... args); // (1) C++11
    template <class... Args>
    constexpr iterator
      emplace(const_iterator position, Args&&... args); // (1) C++20

    template <class... Args>
    iterator
      vector<bool>::emplace(const_iterator position,
                            Args&&... args);         // (2) C++14
    template <class... Args>
    constexpr iterator
      vector<bool>::emplace(const_iterator position,
                            Args&&... args);         // (2) C++20

## 概要

任意の位置に要素を直接構築で挿入する

## 要件

要素型 `value_type` は、引数 `args` からコンテナに対して `EmplaceConstructible` でなければならない。また、要素型 `value_type` はコンテナに対して、`MoveInsertable` であり、かつ、`MoveAssignable` でなければならない。

## 効果

`std::forward<Args>(args)...` で構築された `value_type` 型のオブジェクトを `position` の手前に挿入する。

## 戻り値

`args` から構築され `vector` に新規に追加された要素を指すイテレータを返す。

## 計算量

挿入される要素の数と挿入される要素の位置と`end()`の間の要素数に対して、線形時間の計算量が必要である。

## 備考

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

## 例

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

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

      v.emplace(v.begin(), 3, std::string("hello"));
      v.insert(v.begin(), 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;
      });
    }

### 出力

    1,world
    3,hello

## バージョン

### 言語

- C++11

### 処理系

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

## 参照

- N2345 Placement Insert for Containers (Revision 2)
- 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()`ページを参照。
- P1004R2 Making `std::vector` constexpr