boost :: range_iterator和boost :: iterator_range混乱

时间:2012-11-08 10:11:19

标签: c++ boost boost-range

我一直在浏览boost::range库并注意到boost :: range_iterator和boost::iterator_range。我在这里对这些术语感到困惑。请问有谁可以解释两者之间有什么区别,何时使用什么?此外,如果您能指出示例示例,除了文档之外,还可以使用增强范围库来了解更多相关信息。感谢

2 个答案:

答案 0 :(得分:9)

  

有谁可以解释两者之间的区别以及何时使用什么?

range_iterator用于以下列方式获取范围迭代器的类型:

range_iterator< SomeRange >::type

它与std::iterator_traits相似。例如,您可以从迭代器获取值类型:

std::iterator_traits<int*>::value_type

iterator_range是范围和迭代器之间的桥梁。例如 - 您有一对迭代器,并且您希望将它们传递给只接受范围的算法。在这种情况下,您可以使用iterator_range将迭代器包装到范围内。或者更好 - make_iterator_range - 它将有助于推断类型(如std :: make_pair):

make_iterator_range(iterator1,iterator2)

返回范围。

请考虑以下示例:

live demo

#include <boost/range/iterator_range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/iterator.hpp>
#include <typeinfo>
#include <iostream>
#include <ostream>

using namespace boost;
using namespace std;

struct print
{
    template<typename T>
    void operator()(const T &t) const
    {
        cout << t << " ";
    }
};

int main()
{
    typedef int Array[20];
    cout << typeid( range_iterator<Array>::type ).name() << endl;

    Array arr={11,22,33,44,55,66,77,88};
    boost::for_each( make_iterator_range(arr,arr+5) ,print());
}
  

另外,如果您能指出示例示例,除了文档之外,还可以使用增强范围库来了解更多相关信息

快速摘要 - 请检查this slides

答案 1 :(得分:3)

通常,您不会直接使用boost::range_iterator,因为它是一个模板元函数,它取得给定的范围(无论范围的类型),并返回它的类型begin()/ end()方法

boost::iterator_range用于从一对预先存在的迭代器创建新范围。通常在使用仍基于迭代器的代码并使用它转换为范围时,您将更有可能使用它。