SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

C++の新機能を理解する──rangesライブラリとジェネレータ

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

より自然な条件判定が可能になるcontains/starts_with/ends_with[C++ 23]

 C++ 23では、より自然な条件判定が可能になるcontains/starts_with/ends_with関数が使えるようになりました。

 これらの関数はもともと<algorithm>ヘッダで提供されていて、C++ 23でRange対応版が利用可能になったということです。

  • contains:要素が含まれるか判定
  • starts_with:先頭部分の要素が一致するか判定
  • ends_with:末尾部分の要素が一致するか判定

 これらの新しい関数によって、コードの表現力が向上し、特定の要素の存在、Rangeの先頭、または末尾の一致を簡潔に判定できるようになります。

 例えば以下は、ベクターについて要素の存在確認、先頭部、末尾部の一致を判定する例です。

リスト algorithm.cpp
std::vector<int> v = {1, 2, 3, 4, 5};	// 元となるベクター

// 指定要素が含まれるか判定する
bool result = ranges::contains(v, 3);
cout << "3 is " << (result? "" : "not ") << "in vector." << endl;
	// 3 is in vector.

// 先頭部が指定するベクターに一致するか判定する
bool result2 = ranges::starts_with(v, std::vector<int>{1, 2});
cout << "[1, 2] is " << (result2? "" : "not ") << "prefix of vector." << endl;
	// [1, 2] is prefix of vector.

// 末尾部が指定するベクターに一致するか判定する
bool result3 = ranges::ends_with(v, std::vector<int>{4, 5});
cout << "[4, 5] is " << (result3? "" : "not ") << "suffix of vector." << endl;
	// [4, 5] is suffix of vector.

 C++20より前では、これらの判定を行うためには、std::findやstd::search、std::equalなどを組み合わせて実装する必要がありました。しかし、C++23で導入されたこれらの関数により、より自然な条件判定が可能になったわけです。

 その他にも、C++ 23で利用可能になった関数には、以下もあります。

  • contains_subrange:指定した部分列(サブレンジ)が存在するか判定
  • find_last:指定した値が最後に現れる位置を検索し、そのイテレータを返す
  • find_last_if:指定条件を満たす要素が最後に現れる位置を検索し、イテレータを返す
  • find_last_if_not:指定条件を満たさない要素が最後に現れる位置を検索

Rangeからコンテナへの変換が簡単なstd::ranges::to[C++ 23]

 C++ 23では、Rangeからコンテナへ容易に変換できるstd::ranges::to関数が使えるようになりました。

 std::ranges::to関数は、Rangeによって処理されたデータを直接任意のコンテナへ変換する機能を提供します。これによって、「コンテナ→Range処理→Range処理→…→コンテナ」という一連の処理を遅延を伴うことなく実現できるようになります。

 変換には、パイプラインの最後をto関数とするだけです。例えば以下は、整数のベクターを作成し、パイプラインで偶数のみ抽出、それを2乗する加工を施し、再びベクターに戻すという例です。

リスト to.cpp
vector<int> v = {1, 2, 3, 4, 5};
auto result = v | views::filter([](int x) { return x % 2 == 0; })
                | views::transform([](int x) { return x * x; })
                | ranges::to<std::vector>();	// 結果をstd::vectorに変換

cout << "Resulting Vector: ";
for (const auto& value : result) {
  cout << value << " ";
}
cout << endl;	// Resulting Vector: 4 16

 std::ranges::to<std::vector>を使用することで、パイプライン処理の最終結果をstd::vectorとして取得できます。

次のページ
コルーチンベースで効率的なジェネレータstd::generator[C++ 23]

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

【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/23848 2026/04/15 08:00

イベント

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

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

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

メールバックナンバー