BOOST_FOREACH
许多语言都内置有foreach这种语法用于遍历数组,比如Base、C#,可惜C++没有,虽然STL里有std::for_each,但它需要单独写一个函数对象,一点也不方便,相比std::for_each,boost提供了更强大更方便的BOOST_FOREACH,下面是几个例子:
#include <iostream> #include <vector> #include <boost/foreach.hpp> int main() { // 遍历数组 int arr[] = {1, 2, 3}; BOOST_FOREACH(int i, arr) std::cout << i; // 将输出123 std::cout << std::endl; // 遍历STL容器 std::vector<int> vec(3, 1); BOOST_FOREACH(int i, vec) std::cout << i; // 将输出111 std::cout << std::endl; // 遍历字符串 char* str = "StarsunYzL"; BOOST_FOREACH(char ch, str) std::cout << ch; // 将输出StarsunYzL std::cout << std::endl; return 0; }
可以看到BOOST_FOREACH可以遍历数组、STL容器、字符串等,通过扩展,BOOST_FOREACH还可以遍历自定义的类型。
BOOST_FOREACH可以嵌套,而且可以用引用来遍历:
#include <iostream> #include <vector> #include <boost/foreach.hpp> int main() { std::vector<std::vector<int> > matrix_int(3); BOOST_FOREACH(std::vector<int>& row, matrix_int) { row.push_back(1); row.push_back(2); } BOOST_FOREACH(std::vector<int>& row, matrix_int) { BOOST_FOREACH(int& i, row) { std::cout << i; // 输出121212 } } return 0; }
BOOST_FOREACH循环体里可以使用continue、break、return:
#include <boost/foreach.hpp> int main() { int arr[] = {0, 1, 2}; BOOST_FOREACH(int i, arr) { if (i == 0) continue; if (i == 1) break; if (i == 2) return 0; } return 0; }
BOOST_REVERSE_FOREACH甚至还可以反向遍历:
#include <iostream> #include <boost/foreach.hpp> int main() { int arr[] = {1, 2, 3}; BOOST_REVERSE_FOREACH(int i, arr) std::cout << i; // 输出321 return 0; }
可以看到BOOST_FOREACH几乎可以媲美其它语言内置的foreach,并且官方文档说BOOST_FOREACH的性能几乎等于手写的for循环。
发表评论
| Trackback
