【问题标题】:boost::range_iterator and boost::iterator_range confusionboost::range_iterator 和 boost::iterator_range 混淆
【发布时间】:2012-10-28 12:31:15
【问题描述】:

我浏览了boost::range 库并注意到boost::range_iteratorboost::iterator_range。我在这里对这些术语感到困惑。谁能解释一下两者之间的区别以及何时使用什么?此外,如果您能指出我使用 boost range 库的示例示例来了解更多关于它的信息,那将是很好的。

【问题讨论】:

    标签: c++ boost boost-range


    【解决方案1】:

    谁能解释一下两者有什么区别,什么时候用什么?

    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());
    }
    

    另外,如果你能指出我使用 boost range 库的示例示例,除了文档之外还可以了解更多信息

    如需快速总结,请查看this slides

    【讨论】:

      【解决方案2】:

      一般来说,你不会直接使用boost::range_iterator,因为它是一个模板元函数,它接受给定的范围(不管范围的类型),并返回它的 begin()/end() 方法的类型。

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

      【讨论】:

        猜你喜欢
        • 2012-10-29
        • 2012-06-24
        • 1970-01-01
        • 2018-09-10
        • 2016-07-21
        • 1970-01-01
        • 2021-12-08
        • 2016-12-17
        • 2023-03-18
        相关资源
        最近更新 更多