C++ Boost Foreach超详细分析讲解
作者:无水先生
一、说明
Boost.Foreach 提供了一个宏来模拟 C++11 中基于范围的 for 循环。您可以使用在 boost/foreach.hpp 中定义的宏 BOOST_FOREACH 来迭代序列而不使用迭代器。如果你的开发环境支持C++11,可以忽略Boost.Foreach。
二、示例代码
2.1 最简单的代码
#include <string> #include <iostream> #include <boost/foreach.hpp> int main() { std::string hello("Hello, world!"); BOOST_FOREACH(char ch, hello) { std::cout << ch; } return 0; }
运算结果:
2.2 使用BOOST_FOREACH与BOOST_REVERSE_FOREACH
#include <boost/foreach.hpp> #include <array> #include <iostream> int main() { std::array<int, 4> a{{0, 1, 2, 3}}; BOOST_FOREACH(int &i, a) i *= i; BOOST_REVERSE_FOREACH(int i, a) { std::cout << i << '\n'; } }
运算结果:
BOOST_FOREACH 需要两个参数。第一个参数是一个变量或引用,第二个是一个序列。第一个参数的类型需要与序列中元素的类型相匹配。
任何提供迭代器的东西,比如标准库中的容器,都被归类为一个序列。 Boost.Foreach 使用 Boost.Range 而不是直接访问成员函数 begin() 和 end()。然而,因为 Boost.Range 是基于迭代器的,任何提供迭代器的东西都与 BOOST_FOREACH 兼容。
示例 52.1 使用 BOOST_FOREACH 迭代 std::array 类型的数组。传递的第一个参数是一个引用,这样您就可以读取和修改数组中的元素。在示例 52.1 中,第一个循环将每个数字与自身相乘。
第二个循环使用宏 BOOST_REVERSE_FOREACH,它的工作原理与 BOOST_FOREACH 相同,但在一个序列上向后迭代。该循环按顺序将数字 9、4、1 和 0 写入标准输出流。
和往常一样,如果块只包含一个语句,则大括号可以省略。
请注意,您不应使用使循环内的迭代器无效的操作。例如,在向量上迭代时不应添加或删除元素。 BOOST_FOREACH 和 BOOST_REVERSE_FOREACH 要求迭代器在整个迭代过程中有效。
三、BOOST_FOREACH特点和应用范围
和传统的for或者std::for_each()算法比起来,BOOST_FOREACH显得更加优雅而简洁。
BOOST_FOREACH支持遍历所有被Boost.Range识别为序列类型的对象,通常包括如下几种:
- STL容器
- 数组
- 字符串strings
如下是几个常见的例子:
1. 用BOOST_FOREACH遍历STL容器
2. 使用引用类型获取更高效的遍历
std::list<int> list_int( /*...*/ ); BOOST_FOREACH( int i, list_int ) { // do something with i }
std::vector<std::vector<int> > matrix_int;
BOOST_FOREACH( std::vector<int> & row, matrix_int )
BOOST_FOREACH( int & i, row )
++i;
四、遍历循环控制
使用break, continue,及return实现遍历循环的控制
std::deque<int> deque_int( /*...*/ ); int i = 0; BOOST_FOREACH( i, deque_int ) { if( i == 0 ) return; if( i == 1 ) continue; if( i == 2 ) break; }
此外,还一个小诀窍就是通过define将BOOST_FOREACH定义为更优雅的方式:
#define foreach BOOST_FOREACH
BOOST_FOREACH并不复杂,有兴趣的朋友可以看看,相信对提高大家的编程能力还是很有帮助的。
到此这篇关于C++ Boost Foreach超详细分析讲解的文章就介绍到这了,更多相关C++ Boost Foreach内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!