由 www.169it.com 搜集整理

区间的概念类似于STL中的容器概念。一个区间提供了可以访问半开放区间[first,one_past_last)中元素的迭代器,还提供了区间中的元素数量的信息。

引入区间概念的目的在于:有很多类似于容器的类型,以及用于这些类型的简化算法。

实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void test_range_construct_string()
 {
    typedef std::string::iterator   iterator;
    typedef std::string::const_iterator const_iterator;
    typedef boost::iterator_range<iterator>   irange;
    typedef boost::iterator_range<const_iterator> cirange;
    std::string       str  = "hello world";
    const std::string cstr = "const world";
                                                                                                 
    // 1. 基本构建方法
    boost::iterator_range<std::string::iterator> ir(str);
    boost::iterator_range<std::string::const_iterator> cir(str);
    // 2. 利用make_iterator_range(几种重载函数)
    irange r    = boost::make_iterator_range(str);
    r           = boost::make_iterator_range(str.begin(), str.end());
    cirange r2  = boost::make_iterator_range(cstr);
    r2          = boost::make_iterator_range(cstr.begin(), cstr.end());
    r2          = boost::make_iterator_range(str);
    assert(r == str);
    assert(r.size() == 11);
    irange r3   = boost::make_iterator_range(str, 1, -1);
    assert(boost::as_literal("ello worl") == r3);
    irange r4   = boost::make_iterator_range(r3, -1, 1);    // 这个也可以理解成复制构造
    assert(str == r4);
    std::cout << r4 << std::endl;
    irange r5 = boost::make_iterator_range(str.begin(), str.begin() + 5);
    assert(r5 == boost::as_literal("hello"));
 }

类型变化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void test_range_type()
 {
    using namespace boost;
    // 数组
    const int SIZE = 9;
    typedef int array_t[SIZE];
    const array_t ca = {1, 2, 3, 4, 5, 6, 7, 8, 10};
    assert((is_same<range_iterator<array_t>::type,       int*          >::value));
    assert((is_same<range_value<array_t>::type,             int           >::value));
    assert((is_same<range_difference<array_t>::type,     std::ptrdiff_t>::value));
    assert((is_same<range_size<array_t>::type,           std::size_t   >::value));
    assert((is_same<range_const_iterator<array_t>::type, const int*    >::value));
    assert(begin(ca) == ca);
    assert(end(ca) == ca + size(ca));
    assert(empty(ca) == false);
 }

range-for是C++ 11新增特性,用于循环迭代一个“范围”,该“范围”类似于包含有begin()和end()方法的STL序列容器。所有的STL标准容器都适用于该“范围”,例如vector、string等等。数组也同样可以,只要定义了begin()和end()方法的任何“范围”都可以使用for来循环迭代容器里面的元素,如istream。

语法:

1
for ( range_declaration : range_expression) loop_statement

上述代码的效果类似于:

1
2
3
4
5
6
7
8
9
(__range, __begin and __end are for exposition only):
{    auto && __range = range_expression ; 
for (auto __begin = begin_expr, __end = end_expr;          
__begin != __end; ++__begin) 
{     
range_declaration = *__begin;      
loop_statement    
}
}

迭代器begin_expr和end_expr可以被定义成如下类型:

* 如果__range是数组,(__range) 和 (__range + __bound)表示数组的范围

*如果__range是一个类,实现了begin()或end()方法,或者两个方法都实现了,此时begin_expr就表示 __range.begin(),而 end_expr则表示 __range.end()。

否则begin(__range)和end(__range)将通过基于与std名称空间关联的参数依赖查找规则来查找。

如果range_expression返回一个临时变量,它的生命周期到循环结束,如绑定到右值__range的,但要注意,临时嵌套在range_expression中的并没有延长其生命周期。

如同传统的for语句,关键字break可以提前结束循环,而continue可以继续循环。

example:

1
2
3
4
5
void f(vector<double>& v)
 {    for (auto x : v)
      cout << x << '/n';
      for (auto& x : v) ++x;    // 通过引用可以修改v中的值5
 }

for也可以用于迭代普通的数组,如:

1
2
for (const auto x : { 1,2,3,5,8,13,21,34 })
cout << x << '/n';

误区:

1
2
3
4
5
int* p = new int [2];
p[0] = 1;
p[1] = 2;
for (auto x : p)
cout << x << endl;

编译器会报错误:

错误:对‘begin(int*&)’的调用没有匹配的函数

通过上面对for的介绍可以知道,for实现的机制就是依赖与容器中的begin()和end()方法。对于普通的数组,编译器默认已经实现了类似的方法。这里的p是一个指针,尽管它可以像数组一样使用,但是它并没有类似与begin()或end()的方法,当然会编译不通过。

以上内容根据个人理解结合互联网上相关作者介绍总结,错误再所难免。

文章来源:boost库区间range基本原理及使用实例

boost库区间range基本原理及使用实例的更多相关文章

  1. boost库的安装,使用,介绍,库分类

    1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...

  2. C++ | boost库 类的序列化

    是的,这是今年的情人节,一篇还在研究怎么用的文章,文结的时候应该就用成功了. 恩,要有信心 神奇的分割线 不知何时装过boost库的header-only库, 所以ratslam中的boost是可以编 ...

  3. Boost库实现线程池学习及线程实现的异步调用

    A.Boost线程池实现 参考自: Boost库实现线程池实例 原理:使用boost的thread_group存储多个线程,使用bind方法将要处理的函数转换成线程可调用的函数进行执行:使用队列存储待 ...

  4. Python和C|C++的混编(一):Python调用C、C++---Boost库

    不使用boost.python库来直接构建dll的话比较繁琐,下面实例是借助boost库实现python对C.C++的调用 1 首先确定已经安装python和boost库,本例测试环境是python2 ...

  5. (三)Boost库之字符串处理

    (三)Boost库之字符串处理 字符串处理一直是c/c++的弱项,string_algo库很好的弥补了这一点. string_algo 库算法命名规则: 前缀i    : 有这个前缀表名算法的大小写不 ...

  6. (九)boost库之文件处理filesystem

    (九)boost库之文件处理filesystem   filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能 ...

  7. (五)boost库之随机数random

    (五)boost库之随机数random boost库为我们提供了许多的日常随机数生成器: 1.uniform_smallint:在小整数域内的均匀分布 2.uniform_int:在整数域上的均匀分布 ...

  8. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  9. (一)boost库之日期、时间

    (一)boost库之日期.时间 一.计时器  计时器,通常在一个项目中统计一个函数的执行时间是非常实用的.   #include <boost/timer.hpp> void PrintU ...

随机推荐

  1. cocos2d-x 1970毫秒数转时间

    转自:http://www.cocos2dev.com/?p=322 做网络游戏时,服务器的时间在本地显示的时候要转成本地时间,可以利用系统函数转化. ";//假如这是服务器的时间 ] = ...

  2. UVa 112 Tree Summing

    题意: 计算从根到叶节点的累加值,看看是否等于指定值.是输出yes,否则no.注意叶节点判断条件是没有左右子节点. 思路: 建树过程中计算根到叶节点的sum. 注意: cin读取失败后要调用clear ...

  3. 记录一下跟Python有关的几个拓展名

    .py python文本源码文件,也可以用python.exe直接运行 .pyw 也是python的文本源码文件,但是默认由pythonw.exe打开,而且不显示命令行窗口,带GUI的python代码 ...

  4. 【M8】了解各种不同意义的new和delete

    1.首先考虑new operator,new operator 可以认为做了三件事情:a.调用operator new分配一块内存:b.在这块内存上调用构造方法构造对象:返回指针. 2.operato ...

  5. 2015南阳CCPC E - Ba Gua Zhen 高斯消元 xor最大

    Ba Gua Zhen Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description During the Three-Kingdom perio ...

  6. BZOJ 4236: JOIOJI MAP

    4236: JOIOJI Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.ph ...

  7. 把json格式对象转成可提交字符串格式,会过滤掉函数 {a: {b: 3}, b: [1], c: "d"} -> a.b=3&b[0]=1&c=d

    var json = { name: "任务名称" , scoreRule: "", score: "", // 如果规则表达式不为空,则默 ...

  8. 进程间通信之POSIX信号量

    POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...

  9. Spring 的微内核与FactoryBean扩展机制--转载

    作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...

  10. SSIS 学习(8):事务【转】

    事务,在数据库开发与应用中,发挥了重要的作用,但在Integration Services 包开发过程中,我们还一直没有提到过这个概念,它是不是还是如此,能让各数据库兄弟和睦相处,团结一致,同进退.共 ...