C++ Boost Foreach超详细分析讲解

 更新时间:2022年11月23日 15:42:10   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++的头文件和实现文件详解

    C++的头文件和实现文件详解

    这篇文章主要介绍了C++的头文件和实现文件详解的相关资料,需要的朋友可以参考下
    2015-01-01
  • Qt计时器使用方法详解

    Qt计时器使用方法详解

    这篇文章为大家详细主要介绍了Qt计时器的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • OpenCV通过透视变换实现矫正图像详解

    OpenCV通过透视变换实现矫正图像详解

    这篇文章主要为大家详细介绍了OpenCV如何通过透视变换实现将一张折射的图片给矫正过来,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-02-02
  • C++ 中的 mutable关键字作用与使用场景分析(最新推荐)

    C++ 中的 mutable关键字作用与使用场景分析(最新推荐)

    C++中的mutable关键字允许在常量成员函数中修改特定成员变量,主要用于缓存机制、延迟计算和多线程同步等场景,它在设计中提供灵活性,但使用时需谨慎,本文介绍C++ 中的 mutable关键字作用与使用场景分析,感兴趣的朋友一起看看吧
    2025-02-02
  • C++ explicit关键字讲解

    C++ explicit关键字讲解

    这篇文章主要介绍了C++ explicit关键字讲解,++提供了explicit关键字,相对于implicit而言,他默认关闭了隐式类型转换方法。至于两者有什么区别,看下面文章内容的介绍吧
    2021-12-12
  • Linux下使用C/C++进行UDP网络编程详解

    Linux下使用C/C++进行UDP网络编程详解

    UDP 是User Datagram Protocol 的简称,中文名是用户数据报协议,是一种无连接、不可靠的协议,本文主要介绍了如何在Linux下使用C/C++进行UDP网络编程,有需要的可以了解下
    2024-10-10
  • C语言中 int main(int argc,char *argv[])的两个参数详解

    C语言中 int main(int argc,char *argv[])的两个参数详解

    这篇文章主要介绍了C语言中 int main(int argc,char *argv[])的两个参数详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • C/C++实现跨文件共享全局变量详解

    C/C++实现跨文件共享全局变量详解

    这篇文章主要为大家详细介绍了C/C++如何实现跨文件共享全局变量,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • c语言标准库中字符转换函数和数字转换函数

    c语言标准库中字符转换函数和数字转换函数

    这篇文章主要介绍了c标准库中字符转换函数和数字转换函数,需要的朋友可以参考下
    2014-04-04
  • C++实现坦克大战小游戏EGE图形界面

    C++实现坦克大战小游戏EGE图形界面

    这篇文章主要为大家详细介绍了C++实现坦克大战小游戏EGE图形界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论