1. 概念
区间的概念类似于STL中的容器概念。一个区间提供了可以访问半开放区间[first,one_past_last)中元素的迭代器,还提供了区间中的元素数量的信息。
1.1 目的
引入区间概念的目的在于:有很多类似于容器的类型,以及用于这些类型的简化算法。
1.2 用于的类型
类似于标准的容器
std::pair<iterator,iterator>
内建数组
2. 示例
构造方法
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"));
}
类型变化
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);
}