boost::range(区间)介绍

本文介绍了如何使用boost库中的boost::range进行区间操作,包括通过不同方式构造区间对象,如基本构建方法和利用make_iterator_range函数。此外,还展示了针对数组类型的区间操作,并检查了相关迭代器类型和区间属性。
1. 概念
区间的概念类似于STL中的容器概念。一个区间提供了可以访问半开放区间[first,one_past_last)中元素的迭代器,还提供了区间中的元素数量的信息。
1.1 目的
引入区间概念的目的在于:有很多类似于容器的类型,以及用于这些类型的简化算法。
1.2 用于的类型
类似于标准的容器
std::pair<iterator,iterator>
内建数组
2. 示例
构造方法
  1. void test_range_construct_string()  
  2. {  
  3.     typedef std::string::iterator                   iterator;  
  4.     typedef std::string::const_iterator             const_iterator;  
  5.     typedef boost::iterator_range<iterator>           irange;  
  6.     typedef boost::iterator_range<const_iterator> cirange;  
  7.     std::string       str  = "hello world";  
  8.     const std::string cstr = "const world";  
  9.       
  10.     // 1. 基本构建方法  
  11.     boost::iterator_range<std::string::iterator> ir(str);  
  12.     boost::iterator_range<std::string::const_iterator> cir(str);  
  13.   
  14.     // 2. 利用make_iterator_range(几种重载函数)  
  15.     irange r    = boost::make_iterator_range(str);  
  16.     r           = boost::make_iterator_range(str.begin(), str.end());  
  17.     cirange r2  = boost::make_iterator_range(cstr);  
  18.     r2          = boost::make_iterator_range(cstr.begin(), cstr.end());  
  19.     r2          = boost::make_iterator_range(str);  
  20.     assert(r == str);  
  21.     assert(r.size() == 11);  
  22.   
  23.     irange r3   = boost::make_iterator_range(str, 1, -1);  
  24.     assert(boost::as_literal("ello worl") == r3);  
  25.     irange r4   = boost::make_iterator_range(r3, -1, 1);    // 这个也可以理解成复制构造  
  26.     assert(str == r4);  
  27.     std::cout << r4 << std::endl;  
  28.   
  29.     irange r5 = boost::make_iterator_range(str.begin(), str.begin() + 5);  
  30.     assert(r5 == boost::as_literal("hello"));  
  31. }  
类型变化
  1. void test_range_type()  
  2. {  
  3.     using namespace boost;  
  4.   
  5.     // 数组  
  6.     const int SIZE = 9;  
  7.     typedef int array_t[SIZE];  
  8.     const array_t ca = {1, 2, 3, 4, 5, 6, 7, 8, 10};  
  9.   
  10.     assert((is_same<range_iterator<array_t>::type,       int*          >::value));  
  11.     assert((is_same<range_value<array_t>::type,             int           >::value));  
  12.     assert((is_same<range_difference<array_t>::type,     std::ptrdiff_t>::value));  
  13.     assert((is_same<range_size<array_t>::type,           std::size_t   >::value));  
  14.     assert((is_same<range_const_iterator<array_t>::type, const int*    >::value));  
  15.   
  16.     assert(begin(ca) == ca);  
  17.     assert(end(ca) == ca + size(ca));  
  18.     assert(empty(ca) == false);  
  19. }  






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值