BOOST_FOREACH

2009年11月25日 | 分类: C/C++ | 标签: ,

许多语言都内置有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循环。

目前还没有任何评论.