のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

C++11 foreach 手軽にループを回したい貴方へ

Sponsored Links

皆さんこんにちは
お元気ですか。最近ようやく涼しそうなパスタがおいしそうな季節がやってまいりました。

さて、本日はC++11の機能を紹介していこうと思う。
その中で、今日はforeachの紹介をしたい。

foreachって?

最初から最後まで全てをたどることができる。ループの文章です。
最近では様々な言語で使うことができますね。(Java,Pythonでは実装されています。ほかも多分あると思います)

例えば以下のような例があります。

#include <iostream>
using namespace std;

int main(void){
	int vect[5] = {1,2,3,4,5};
	for(int i = 0; i < 5; i++){
		cout << vect[i] << endl;
	}

	for(int x : vect){
		cout << x << endl;
	}
}

従来までは以下のような描き方をしなければならず、
数の変更があった場合、変数の変更が必要でした。

int vect[5] = {1,2,3,4,5};
for(int i = 0; i < 5; i++){
	cout << vect[i] << endl;
}

しかし、C++11よりforeachを使うことで
最後まで操作する方式を簡単に書くことができます。

for(int x : vect){
	cout << x << endl;
}

どんなものに使えるの?

.begin(),.end()があるSTL,Listとか配列には使えます。
以下のような感じで書くことができます

vector

void foreach_vector(){
	vector<int> vect(5);
	vect[0] = 0; vect[1] = 2; vect[2] = 4; vect[3] = 5; vect[4] = 10;
	for(int &x:vect){
		cout << x << endl;
	}
}

map

中はpairで取り出せるのですね。

void foreach_map(){
	map<string,int> mp;
	mp["aaa"] = 10;
	mp["bbb"] = 20;
	mp["ccc"] = 30;

	for(pair<string, int> p:mp){
		cout << p.first << " " << p.second << endl;
	}
}

vectorの中にvector

void foreach_vector_in_vector(){
	vector<vector<int> > vect;
	for(int i = 0; i < 5; i++){
		vector<int> vector_in;
		for(int j = 0; j < 8; j++){
			vector_in.push_back(i*j);
		}
		vect.push_back(vector_in);
	}

	for(vector<int> v:vect){
		for(int x:v){
			cout << x << endl;
		}
	}
}

ソースコード全文

#include <iostream>
#include <vector>
#include <utility>
#include <map>

using namespace std;

void foreach_array(){
	int array[5] = {1,2,3,4,5};
	for(int x : array){
		cout << x << endl;
	}
}

void foreach_vector(){
	vector<int> vect(5);
	vect[0] = 0; vect[1] = 2; vect[2] = 4; vect[3] = 5; vect[4] = 10;
	for(int &x:vect){
		cout << x << endl;
	}
}

void foreach_map(){
	map<string,int> mp;
	mp["aaa"] = 10;
	mp["bbb"] = 20;
	mp["ccc"] = 30;

	for(pair<string, int> p:mp){
		cout << p.first << " " << p.second << endl;
	}
}

void foreach_vector_in_vector(){
	vector<vector<int> > vect;
	for(int i = 0; i < 5; i++){
		vector<int> vector_in;
		for(int j = 0; j < 8; j++){
			vector_in.push_back(i*j);
		}
		vect.push_back(vector_in);
	}

	for(vector<int> v:vect){
		for(int x:v){
			cout << x << endl;
		}
	}
}

int main(void){
	foreach_array();
	foreach_vector();
	foreach_map();
	foreach_vector_in_vector();
}

参考文献

C++11 - Wikipedia