読者です 読者をやめる 読者になる 読者になる

kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

Boost.Foreach

Chapter 7. Boost.Foreach - 1.47.0

マクロで定義されたforeach。
(C+11でRange-based for loopがサポートされたので必要なくなっちゃいましたね)
配列、STLコンテナ、std::pairイテレータ、Null-terminated string(char and wchar_t)を回せる。

※ただし、マクロなので型に,が含まれてるとダメ
外に出すか、typedefする

boost_foreach_TEST.cpp

#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
#include<boost/foreach.hpp>

int main(){
	int a[] = { 0, 2, 4, 6, 8 };
	int size = sizeof(a)/sizeof(a[0]);
	std::vector<int> b(a,a+size);
	std::map<std::string, std::string> MS;
	MS["MS-06FZ"] = "ザクII改";
	MS["MS-18E"]  = " ケンプファー";
	MS["MSM-03C"] = "ハイゴッグ";


	std::cout<<"a = ";
	BOOST_FOREACH(int e, a){ std::cout<< e << " "; }
	std::cout << std::endl;

	std::cout<<"b = ";
	BOOST_FOREACH(int e, b) std::cout<< e << " "; std::cout << std::endl;

	std::cout << "MS" <<std::endl;
	//マクロなので型に,が含まれてるとダメ
	//BOOST_FOREACH(std::pair<std::string, std::string> e, MS) std::cout << e.first <<" "<<e.second <<std::endl;
	std::pair<std::string, std::string> ele;
	BOOST_FOREACH(ele, MS) std::cout<<ele.first <<" "<<ele.second <<std::endl;
	
	std::cout << "typedefしてもおk"<<std::endl;
	typedef std::pair<std::string, std::string> e_t;
	BOOST_FOREACH(e_t e, MS) std::cout << e.first <<" "<<e.second <<std::endl;

	return 0;
}

結果

a = 0 2 4 6 8
b = 0 2 4 6 8
MS
MS-06FZ ザクII改
MS-18E  ケンプファー
MSM-03C ハイゴッグ
typedefしてもおk
MS-06FZ ザクII改
MS-18E  ケンプファー
MSM-03C ハイゴッグ