最終更新日時: 2026年07月22日 16時08分23秒 (JST)
rotarymars が更新

履歴 編集

function
<flat_map>

# std::flat_map::replace(C++23)

    void
      replace(key_container_type&& key_cont,
              mapped_container_type&& mapped_cont); // (1) C++23
    constexpr void
      replace(key_container_type&& key_cont,
              mapped_container_type&& mapped_cont); // (2) C++26

## 概要

キーのコンテナ、値のコンテナをそれぞれ置き換える。

## 効果

`flat_map` クラスが内部で保持している `containers` を `c` とすると、以下と等価。

    c.keys = std::move(key_cont);
    c.values = std::move(mapped_cont);

## 事前条件

- `key_cont.size() == mapped_cont.size()` が真であること。
- `key_cont` が `key_compare` に基づいてソートされていること。
- `key_cont` に重複する要素がないこと。

## 計算量

`key_cont` および `mapped_cont` をムーブした計算量と同じ。

## 例

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

    int main()
    {
      std::vector<std::string> keys = {"Alice", "Bob", "Carol"};
      std::vector<int> values = {3, 1, 4};

      // 事前条件の確認
      assert(keys.size() == values.size());
      assert(std::is_sorted(keys.begin(), keys.end()));
      assert(std::adjacent_find(keys.begin(), keys.end()) == keys.end());

      std::flat_map<std::string, int> fm;

      std::cout << fm.size() << std::endl;

      fm.replace(std::move(keys), std::move(values));

      std::cout << fm.size() << std::endl;
      std::cout << std::endl;

      std::cout << "{" << std::endl;
      for (const auto& kv: fm) {
        std::cout << "  " << kv.first << ": " << kv.second << "," << std::endl;
      }
      std::cout << "}" << std::endl;
    }

### 出力

    0
    3

    {
      Alice: 3,
      Bob: 1,
      Carol: 4,
    }

## バージョン

### 言語

- C++23

### 処理系

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

## 参照

- P3372R3 constexpr containers and adaptors