最終更新日時(UTC):
が更新

履歴 編集

class template
<flat_map>

std::flat_map(C++23)

namespace std {
  template <class Key,
            class T,
            class Compare = less<Key>,
            class KeyContainer = vector<Key>,
            class MappedContainer = vector<T>>
  class flat_map;
}

概要

メンバ関数

構築・破棄

名前 説明 対応バージョン
(constructor) コンストラクタ C++23
(destructor) デストラクタ C++23
operator= 代入演算子 C++23

イテレータ

名前 説明 対応バージョン
begin 先頭を指すイテレータを取得する C++23
cbegin 先頭を指す読み取り専用イテレータを取得する C++23
end 末尾の次を指すイテレータを取得する C++23
cend 末尾の次を指す読み取り専用イテレータを取得する C++23
rbegin 末尾を指す逆イテレータを取得する C++23
crbegin 末尾を指す読み取り専用逆イテレータを取得する C++23
rend 先頭の前を指す逆イテレータを取得する C++23
crend 先頭の前を指す読み取り専用逆イテレータを取得する C++23

領域

名前 説明 対応バージョン
empty コンテナが空であるかどうかを調べる C++23
size 要素数を取得する C++23
max_size 格納可能な最大の要素数を取得する C++23

コンテナの変更

名前 説明 対応バージョン
clear 全ての要素を削除する C++23
insert 要素を挿入する C++23
insert_or_assign 要素を挿入、あるいは代入する C++23
insert_range Rangeを挿入する C++23
emplace 要素を直接構築する C++23
emplace_hint ヒントを使って要素を直接構築する C++23
try_emplace キーが存在しない場合のみ要素を直接構築する C++23
erase 要素を削除する C++23
swap コンテンツを交換する C++23
extract キーのコンテナ、値のコンテナを取得する C++23
replace キーのコンテナ、値のコンテナを置き換える C++23

要素アクセス

名前 説明 対応バージョン
operator[] 指定したキーを持つ要素を取得する C++23
at 指定したキーを持つ要素を取得する C++23
count 指定したキーにマッチする要素の数を取得する C++23
find 指定したキーで要素を探す C++23
contains 指定したキーの要素が含まれているかを判定する C++23
equal_range 指定したキーにマッチする要素範囲を取得する C++23
lower_bound 与えられた値より小さくない最初の要素へのイテレータを取得する C++23
upper_bound 特定の値よりも大きい最初の要素へのイテレータを取得する C++23

オブザーバー

名前 説明 対応バージョン
key_comp キー比較用の関数オブジェクトを取得する C++23
value_comp 要素比較用の関数オブジェクトを取得する C++23
keys キーのコンテナを取得する C++23
values 値のコンテナを取得する C++23

メンバ型

名前 説明 対応バージョン
key_type キーの型。テンプレートパラメータ Key C++23
mapped_type 値の型。テンプレートパラメータ T C++23
value_type 要素の型。std::pair<key_type, mapped_type> C++23
key_compare キー値の大小関係を判定する二項述語の型。テンプレートパラメータ Compare C++23
value_compare 要素値のキー部分で大小関係を判定する二項述語の型。入れ子クラス C++23
reference 要素への参照型。std::pair<const key_type&, mapped_type&> C++23
const_reference 要素へのconst参照型。std::pair<const key_type&, const mapped_type&> C++23
size_type 要素数を表す符号なし整数型 size_t C++23
difference_type 同一のコンテナを指す iterator の差を表す符号付き整数型 ptrdiff_t C++23
iterator ランダムアクセスイテレータ C++23
const_iterator 読み取り専用ランダムアクセスイテレータ C++23
reverse_iterator 逆順ランダムアクセスイテレータ。std::reverse_iterator<iterator> C++23
const_reverse_iterator 読み取り専用逆順ランダムアクセスイテレータ。std::reverse_iterator<const_iterator> C++23
key_container_type キーを格納するコンテナ型 KeyContainer C++23
mapped_container_type 値を格納するコンテナ型 MappedContainer C++23
containers キーのコンテナと値のコンテナを保持する型 C++23
key_equiv 要素をとってキーの等価比較を行う説明専用の関数オブジェクト C++23

非メンバ関数

要素削除

名前 説明 対応バージョン
erase_if 指定した条件に合致する要素とその分の領域を、コンテナから削除する C++23

非メンバ(Hidden friends)関数

比較演算子

名前 説明 対応バージョン
operator== 左辺と右辺が等しいかの判定を行う C++23
bool operator!=(const flat_map& x, const flat_map& y); 左辺と右辺が等しくないかの判定を行う (==により使用可能) C++23
operator<=> 三方比較を行う C++23
bool operator<(const flat_map& x, const flat_map& y); 左辺が右辺より小さいかの判定を行う (<=>により使用可能) C++23
bool operator<=(const flat_map& x, const flat_map& y); 左辺が右辺より小さいか等しいかの判定を行う (<=>により使用可能) C++23
bool operator>(const flat_map& x, const flat_map& y); 左辺が右辺より大きいかの判定を行う (<=>により使用可能) C++23
bool operator>=(const flat_map& x, const flat_map& y); 左辺が右辺より大きいか等しいかの判定を行う (<=>により使用可能) C++23

入れ替え

名前 説明 対応バージョン
swap 2つのflat_mapオブジェクトを入れ替える C++23

推論補助

名前 説明 対応バージョン
(deduction_guide) クラステンプレートの推論補助 C++23

基本的な使い方

#include <iostream>
#include <string>
#include <flat_map>

int main()
{
  // stringをキー、intを値として扱う連想配列
  std::flat_map<std::string, int> fm = {
    {"Carol", 4},
    {"Alice", 3},
    {"Bob", 1}
  };

  // 検索 : キー(string)を指定し、値(int)を得る
  int r = fm.at("Alice");
  std::cout << r << std::endl;

  // 全体を出力する
  for (const auto& [key, value] : fm) {
    std::cout << key << " : " << value << std::endl;
  }
}

出力

3
Alice : 3
Bob : 1
Carol : 4

ユーザー定義型をキーとして使用する (operator<=>を定義)

#include <iostream>
#include <string>
#include <flat_map>

// 要素がひとつの場合
struct MyInt {
  int value;

  friend auto operator<=>(const MyInt& a, const MyInt& b) noexcept {
    return a.value <=> b.value;
  }
};

// 要素が複数の場合
struct Person {
  int id;
  int age;
  std::string name;

  friend auto operator<=>(const Person& a, const Person& b) noexcept {
    if (auto comp = a.id <=> b.id; comp != 0) {
      return comp;
    }
    if (auto comp = a.age <=> b.age; comp != 0) {
      return comp;
    }
    return a.name <=> b.name;
  }
};

int main()
{
  std::flat_map<MyInt, int> fm1 {
    {MyInt{1}, 3},
    {MyInt{2}, 1},
    {MyInt{3}, 4},
  };
  std::cout << fm1[MyInt{2}] << std::endl;

  std::flat_map<Person, int> fm2 {
    {Person{1, 18, "Alice"}, 3},
    {Person{2, 30, "Bob"}, 1},
    {Person{3, 30, "Carol"}, 4},
  };
  std::cout << fm2[Person{2, 30, "Bob"}] << std::endl;
}

出力

1
1

ユーザー定義型をキーとして使用する (大小比較の関数オブジェクトを定義)

#include <iostream>
#include <string>
#include <tuple>
#include <flat_map>

// 要素がひとつの場合
struct MyInt {
  int value;
};

struct MyIntLess {
  bool operator()(const MyInt& a, const MyInt& b) const noexcept {
    return a.value < b.value;
  }
};

// 要素が複数の場合
struct Person {
  int id;
  int age;
  std::string name;
};

struct PersonLess {
  bool operator()(const Person& a, const Person& b) const noexcept {
    // キーとして比較したい要素を列挙する
    return std::tie(a.id, a.age, a.name) < std::tie(b.id, b.age, b.name);
  }
};

int main()
{
  std::flat_map<MyInt, int, MyIntLess> fm1 {
    {MyInt{1}, 3},
    {MyInt{2}, 1},
    {MyInt{3}, 4},
  };
  std::cout << fm1[MyInt{2}] << std::endl;

  std::flat_map<Person, int, PersonLess> fm2 {
    {Person{1, 18, "Alice"}, 3},
    {Person{2, 30, "Bob"}, 1},
    {Person{3, 30, "Carol"}, 4},
  };
  std::cout << fm2[Person{2, 30, "Bob"}] << std::endl;
}

出力

1
1

バージョン

言語

  • C++23

処理系

参照