std::initializer list

提供: C++入門
移動: 案内検索
スポンサーリンク

std::initializer_list とは、C++11で追加されたクラスで初期化リストを扱うための機能を提供します。

読み方

std::initializer_list
えすてぃーでぃー いにしゃらいざー りすと

概要

配列や構造体は、初期化リストを扱えました。

int a[] = {1,2,3};
struct Foo {int i; int j;};
Foo foo = { 123, 456 };

しかしながら、クラスでは、上記のような構文で初期化できませんでした。 C++11では、クラスでも初期化リストを扱えるように、std::initializer_listを追加しました。

std::initializer_listを使うとこのようなこともできます。

for(auto i: {1,2,3,4,5}){
	cout << i << " ";
}

コンパイラ

  • clang++ 3.3 では、使用できません。
  • gcc49 を使用しました。

ヘッダファイル

#include <initializer_list>

initializer_list1.cpp の例

コンストラクタで初期化リストを受け取り、std::vectorに入れる例です。std::vectorには、従来通りの方法で入れています。

ソースコード initializer_list1.cpp

#include <iostream>
#include <vector>
#include <initializer_list>
using namespace std;
 
class C {
        vector<int> v;
        public:
        C (std::initializer_list<int> list) {
                for (auto it: list) {
                        v.push_back(it);
                }
        }
        friend std::ostream& operator<<(std::ostream& os, const C& c) {
                for (auto it: c.v) {
                        os << it << " ";
                }
                return os;
        }
};
 
int main(int argc, char const* argv[])
{
        C c = {1,2,3};
        cout << c << endl;
        return 0;
}

コンパイル

g++49 -std=c++11 initializer_list1.cpp -o initializer_list1

実行例

% ./initializer_list1
1 2 3

Range-based forとinitializer_listを組み合わせた例

ソースコード range-based-for_with_initializer_list.cpp

#include <iostream>
#include <initializer_list>
using namespace std;
int main(int argc, char const* argv[])
{
        for(auto i: {1,2,3,4,5}){
                cout << i << " ";
        }
        cout << endl;
        return 0;
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  \
range-based-for_with_initializer_list.cpp -o range-based-for_with_initializer_list

実行例

% ./range-based-for_with_initializer_list
1 2 3 4 5

関連項目




スポンサーリンク