SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【C++の新機能を理解する】最新バージョンを徹底解説!

C++の新機能を理解する――出力と部分シーケンス関連の機能強化

【C++の新機能を理解する】最新バージョンを徹底解説! 第5回

コンテナ関連の強化

 C++ 23では、std::stackとstd::queueにイテレータペアをとるコンストラクタが使えるようになりました。また、メモリ効率と読み出し性能に優れるコンテナstd::flat_map/std::flat_setを使えるようになりました。

 コンテナは、データ処理に有用なデータ構造ですが、利用領域の拡大から、より柔軟性や効率が求められるようになってきています。ここで扱う新機能は、いずれもコンテナの柔軟な取り扱いを可能にし、より優れた効率を追求したものです。

std::stack/std::queueにイテレータペアをとるコンストラクタ[C++ 23]

 std::stackとstd::queueはコンテナアダプタで、vectorなどのコンテナをラップしてFILO(先入れ後出し)およびFIFO(先入れ先出し)型のコンテナを実装するクラスです。

 C++ 23では、これらのクラスのコンストラクタに、イテレータペア(始点と終点のペア)を直接渡せるオーバーロードが追加されました。これにより、他のコンテナクラスと同様に、ranges::to関数(第3回参照)などが直接std::stackとstd::queueを生成できるようになります。

 従来は、以下のように一時コンテナを使って初期化する必要がありました。コンストラクタの引数で、{...}の部分が一時コンテナです。

リスト container.cpp
#include <array>
#include <stack>
#include <queue>
…略…
array<int, 4> arr = {1, 2, 3, 4};

stack<int> st1{{arr.begin(), arr.end()}};
queue<int> qu1{{arr.begin(), arr.end()}};

 C++ 23からは、一時コンテナを使わず直接イテレータペアをコンストラクタに渡せます。若干ですが記述もシンプルになり、効率が向上します。また、以下のようにranges::to関数から直接コンテナを生成できます。

リスト container.cpp
stack<int> st2{arr.begin(), arr.end()};
queue<int> qu2{arr.begin(), arr.end()};
auto st3 = ranges::to<stack<int>>(arr);
auto qu3 = ranges::to<queue<int>>(arr);

メモリ効率と読み出し性能に優れたコンテナstd::flat_map/std::flat_set[C++ 23]

 std::flat_mapとstd::flat_setは、C++ 23で利用可能になった新しいコンテナクラスです。

 それぞれ、マップ(キーと値の対応を保持)、セット(値の集合を保持)の新しい実装となります。従来のstd::map/std::set、std::unordered_map/std::unordered_setに対して、メモリ効率と読み出し性能に優れた特性を持った実装となっています。

 従来のstd::map/std::set、std::unordered_map/std::unordered_setを含めた各コンテナの特徴は大まかに以下のようにまとめられます。

  • std::map/std::set:二分探索木で実装されるため、値そのものに加えてポインタを保持するためのメモリが必要。検索や挿入/削除は高速
  • std::unordered_map/std::unordered_set:ハッシュテーブルのためのメモリと計算量が必要。検索や挿入/削除は高速
  • std::flat_map/std::flat_set:ソート済みの配列を用いることでメモリの利用効率が高い。検索は高速だが挿入や削除と速度面で不利

 std::flat_mapとstd::flat_setは、ソート済みの要素をメモリ上の連続した領域に配置するので、CPUキャッシュの有効性を高め、検索や順次アクセスを高速化することに特化したコンテナです。挿入や削除が頻繁に発生する用途には向きませんが、読み出しに特化した用途に適しています。

 利用方法は、従来のコンテナと変わるものではありません。以下のリストのように、初期化構文、添字アクセス、containsなどの関数、イテレータなどを利用できます。

リスト flat.cpp
#include <flat_map>
#include <flat_set>
…略…
auto m = flat_map<int, string>{{1, "one"}, {2, "two"}, {3, "three"}};
cout << "1: " << m[1] << endl;	// 1: one
for (const auto& [key, value] : m) {
  cout << key << ": " << value << endl;
}

auto s = flat_set<int>{1, 2, 3};
cout << "Contains 2: " << s.contains(2) << endl;	// Contains 2: 1
for (const auto& element : s) {
  cout << "Element: " << element << endl;
}

まとめ

 今回は、C++ 23における標準ライブラリの機能強化について、出力関連、部分シーケンス関連、コレクション関連を中心に紹介しました。

 C++ 23の主要な新機能の紹介は今回で一旦の最終回となります。この後、C++ 26の実装が進んだところで、改めてどこかでC++ 26の新機能も紹介していければと思っています。またお会いしましょう!

この記事は参考になりましたか?

【C++の新機能を理解する】最新バージョンを徹底解説!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/24479 2026/06/12 08:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング