SHOEISHA iD

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

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

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

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

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

部分シーケンス関連の強化

 C++ 23では、多次元のシーケンスのビューを生成できるstd::mdspanを利用できるようになりました。

 部分シーケンスとは、配列やベクターなどの列(シーケンス)から順番を保ったまま、一部の要素だけを取り出してできる列のことです。元となるシーケンスに影響を与えずに安全にシーケンスを取り扱うことができ、数学/アルゴリズム分野で使われます。

1次元の部分シーケンスを生成するstd::span[C++ 20]

 std::mdspanは、C++ 20で利用可能になったstd::spanの多次元版です。

 std::spanは、配列やベクターなどシーケンスの全部あるいは一部を参照する部分シーケンスを生成するクラスです。冒頭の説明のように、もとのシーケンスに影響を与えずに部分的なシーケンスとして利用できます。

リスト span.cpp
#include <iostream>
#include <vector>
#include <span>
…略…
vector<int> arr = {1, 2, 3, 4, 5};
span<int> sp(arr.begin() + 1, arr.begin() + 4);	(1)
cout << "Partial span: ";
for (int val : sp) {	(2)
  cout << val << " ";
}
cout << endl;	// Partial span: 2 3 4

 ここでは、イテレータペアから部分シーケンスを生成するコンストラクタを使用しています(1)。span型は(2)のように独立したシーケンスのように扱うことができます。

行列演算や画像処理に最適な多次元配列ビューstd::mdspan[C++ 23]

 C++ 23からは、多次元のシーケンス例えば2次元配列のビューを生成できるstd::mdspanを利用できるようになりました。

リスト span.cpp
#include <mdspan>
…略…
vector<int> data = {1, 2, 3, 4, 5, 6};	(1)
mdspan<int, extents<size_t, 2, 3>> md2d(data.data());	(2)
cout << "2D mdspan (2x3):" << endl;
for (size_t i = 0; i < 2; ++i) {
  for (size_t j = 0; j < 3; ++j) {
    cout << md2d[i, j] << " ";	(3)
  }
  cout << endl;
	// 2D mdspan (2x3):2D mdspan (2x3):
	// 1 2 3 
	// 4 5 6 
}

 mdspanクラスの機能は、spanのようなシンプルな部分シーケンスにとどまりません。以下のクラスをテンプレートパラメータに指定することで、単なる部分シーケンスを超えたビューの機能を提供します。

  • ElementType:要素の型
  • Extents:多次元配列の次元数(rank)と要素数(extent)
  • LayoutPolicy:インデックスと要素の位置の対応を指定
  • AccessorPolicy:要素アクセス時の挙動を指定

 この例では、vectorによって保持される6要素の配列(1)を、2×3の多次元配列とするビューを生成しています(2)。要素の型ElementTypeはintであり、Extentsクラスにより次元数は2、要素数は3を指定しています。コンストラクタはvectorのdata関数によりメモリ上の位置を受け取ります。

 いったんビューが出来上がれば、第2回で紹介した多次元operator[]によって、(3)のように多次元配列としてアクセスすることが可能です。行列演算や、それを利用した画像処理などに有用でしょう。

次のページ
コンテナ関連の強化

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

【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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング