1. 概念
區間的概念類似於STL中的容器概念。一個區間提供了可以訪問半開放區間[first,one_past_last)中元素的迭代器,還提供了區間中的元素數量的資訊。
1.1 目的
引入區間概念的目的在於:有很多類似於容器的類型,以及用於這些類型的簡化演算法。
1.2 用於的類型
類似於標準的容器
std::pair<iterator,iterator>
內建數組
2. 樣本
構造方法
void test_range_construct_string(){typedef std::string::iteratoriterator;typedef std::string::const_iteratorconst_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);}