最終更新日時: 2026年02月17日 23時22分33秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<flat_set>

# std::flat_set::emplace(C++23)

    template <class... Args>
    pair<iterator, bool> emplace(Args&&... args);           // (1) C++23
    template <class... Args>
    constexpr pair<iterator, bool> emplace(Args&&... args); // (1) C++26

## 概要

コンテナに新しい要素を挿入する。要素は直接構築される（コピーもムーブもされない）。要素のコンストラクタはこの関数に渡された引数を与えることによって呼ばれる。

## パラメータ

- `args...` : 要素のコンストラクタへ転送される引数パック。

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

- `is_constructible_v<value_type, Arg...>`が`true`であること。

## 効果

`value_type`型の変数`t`を`forward<Args>(args)...`で初期化する。このコンテナが`t`と等価なキーをすでにもっている場合、`*this`を変更しない。そうでない場合、キーを格納しているコンテナを`c`、とすると、以下と等価：

    auto it = ranges::upper_bound(c, t, value_comp());
    c.insert(it, std::move(t));

## 戻り値

挿入されたかどうかを示す `bool` と、挿入された要素へのイテレータからなる `pair` を返す。挿入されなかったときは、既存要素へのイテレータを返す。

## 計算量

操作の前のコンテナサイズ（`size()`）を`N`とすると

- 新しい要素が挿入された場合: `N`に対して線形
- 要素の挿入が行われなかった場合: `N`に対して対数

## 例

### 単純な挿入の例

    #include <flat_set>
    #include <iostream>

    int main()
    {
      std::flat_set<int> fs;

      fs.emplace(3);
      fs.emplace(1);
      fs.emplace(4);

      for (int i : fs) {
        std::cout << i << std::endl;
      }
    }

#### 出力

    1
    3
    4

### コンストラクタ引数を渡す例

    #include <flat_set>
    #include <iostream>
    #include <iterator>
    #include <string>

    int main()
    {
      std::flat_set<std::string> fs;
      const char aaa[3] = {'A', 'A', 'A'};

      fs.emplace(5, 'C');
      fs.emplace("BBBB");
      fs.emplace(std::begin(aaa), std::end(aaa));

      for (const std::string& i : fs) {
        std::cout << i << std::endl;
      }
    }

#### 出力

    AAA
    BBBB
    CCCCC

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: ??
- Visual C++: ??

## 関連項目

名前 | 説明
--- | ---
`flat_set::insert` | 要素を挿入する
`flat_set::insert_range` | Rangeを挿入する
`flat_set::emplace_hint` | ヒントを使って要素を直接構築する

## 参照

- P3372R3 constexpr containers and adaptors