「std::initializer list」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「std::initializer_list とは、C++11で追加されたクラスで初期化リストを扱うための機能を提供します。 '''読み方''' ;[[std::i...」)
 
 
行16: 行16:
 
[[C++11]]では、[[クラス]]でも初期化リストを扱えるように、[[std::initializer_list]]を追加しました。
 
[[C++11]]では、[[クラス]]でも初期化リストを扱えるように、[[std::initializer_list]]を追加しました。
  
 +
[[std::initializer_list]]を使うとこのようなこともできます。
 +
<syntaxhighlight lang="cpp">
 +
for(auto i: {1,2,3,4,5}){
 +
cout << i << " ";
 +
}
 +
</syntaxhighlight>
 
== コンパイラ ==
 
== コンパイラ ==
 
 
* [[clang++]] 3.3 では、使用できません。
 
* [[clang++]] 3.3 では、使用できません。
 
* gcc49 を使用しました。
 
* gcc49 を使用しました。
 
 
== ヘッダファイル ==
 
== ヘッダファイル ==
 
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
 
#include <initializer_list>
 
#include <initializer_list>
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== initializer_list1.cpp の例 ==
 
== initializer_list1.cpp の例 ==
 
[[コンストラクタ]]で初期化リストを受け取り、[[std::vector]]に入れる例です。[[std::vector]]には、従来通りの方法で入れています。
 
[[コンストラクタ]]で初期化リストを受け取り、[[std::vector]]に入れる例です。[[std::vector]]には、従来通りの方法で入れています。
行61: 行63:
  
 
=== コンパイル ===
 
=== コンパイル ===
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
g++49 -std=c++11 initializer_list1.cpp -o initializer_list1
 
g++49 -std=c++11 initializer_list1.cpp -o initializer_list1
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
=== 実行例 ===
 
=== 実行例 ===
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
% ./initializer_list1
 
% ./initializer_list1
 
1 2 3
 
1 2 3
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
== Range-based forとinitializer_listを組み合わせた例 ==
 
+
=== ソースコード range-based-for_with_initializer_list.cpp ===
 +
<syntaxhighlight lang="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;
 +
}
 +
</syntaxhighlight>
 +
=== コンパイル ===
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
 +
=== 実行例 ===
 +
<syntaxhighlight lang="bash">
 +
% ./range-based-for_with_initializer_list
 +
1 2 3 4 5
 +
</syntaxhighlight>
 
== 関連項目 ==
 
== 関連項目 ==
 +
* [[for]]
 +
* [[auto]]
 
* [[C++11]]
 
* [[C++11]]
<!--
+
<!-- vim: filetype=mediawiki -->
vim: filetype=mediawiki
+
-->
+

2014年1月3日 (金) 23:49時点における最新版

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

関連項目