SHOEISHA iD

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

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

Modern C++入門

コンテナに正規表現も! Modern C++に必須の基本ライブラリ

第8回 ベーシックな機能はもはや自分で書かなくていい

  • X ポスト
  • このエントリーをはてなブックマークに追加

コンテナ

 STLでは、ベクタ(std::vector)、スタック(std::stack)、キュー(std::queue、std::deque)、マップ(std::map)、セット(std::set)、双方向リスト(atd::list)などがすでに利用できたので、基本的なコンテナは整備されていたと言えます。C++ 11以降では、配列(std::array)、単方向リスト(std::forward_list)などが使えるようになりました。

配列std::array[C++11]

 言語仕様としての配列があるから、コンテナとしての配列はいらないんじゃないかと思われますが、より簡便に安全に使えるものとして、std::arrayが使えるようになっています。

リスト:container.cpp
#include <array>
…略…
array<int, 5> x = {{0, 1, 2, 3, 4}};
auto y = array<int, 5>{{0, 1, 2, 3, 4}};
auto z = array<int, 5>{0, 1, 2, 3, 4};		// C++ 14以降

 std::arrayを使うには、<array>ヘッダファイルをインクルードします。また、3つの文は同じ意味です。3番目(z)だけは、C++ 14以降で可能になった、内側の中カッコを省略できる記法です。

 std::arrayの各要素へのアクセスは、配列と同じで大カッコ([])を使います。要素数を取得するには、size関数を使えます。C言語では、sizeof演算子を使っていましたね。なお、C++ 17以降はstd::size関数でも要素数を取得できます。

リスト:container.cpp
for(int i = 0; i < x.size(); i++) {		// size(x)でもOK(C++ 17)
    cout << i << ":" << x[i] << endl;
}

 std::arrayでは、at関数を使うことで、添え字の範囲チェックを含めたアクセスも可能です。添え字が範囲外の場合は、std::out_of_range例外が発生します。

リスト:container.cpp
try {
    x.at(99) = 99;
} catch (out_of_range& e) {
    cout << "out of range" << endl;
}

 at関数の戻り値は、指定する要素への参照です。std::arrayオブジェクトがconstである場合には、参照もconstとなります。

スパンstd::span[C++20]

 できるだけ安全なコードが望まれる現在の流れを鑑みて、C++ 20には配列や生ポインタを安全に使うことのできるstd::spanが実装されました。std::spanにより、配列などの範囲外アクセスなどからガードされるようになるので、より安全なコードとできます。std::spanに与えることができるのは、配列、生ポインタ、std::vector、std::arrayなどです。

リスト:container.cpp
#include <span>
…略…
int a[] = {0, 1, 2};
span<int> si(a);
cout << si.front() << "," << si.back() << endl;
// 実行結果:0,2
cout << si[9] << endl;
// 実行結果:0

 std::spanを使うには、<array>ヘッダファイルをインクルードします。std::spanのインスタンスを生成するには、コンストラクタの引数にシーケンス(この場合は配列全体)を指定します。いったんstd::spanオブジェクトになると、front関数、back関数などにより配列の要素に安全にアクセスできるようになります。要素へのアクセスは[]演算子を使ってもできますが、範囲外の添え字を使うと、結果は未定義となります(この場合は0が返っている)。

 std::spanにすることでイテレータなども使えるようになりますので、配列や生ポインタを使うケースがあれば、std::spanの利用を検討しましょう。

次のページ
正規表現std::regex[C++11]

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
Modern C++入門連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20220 2024/09/26 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング