我一直在浏览boost::range
图书馆并注意到boost::range_iterator
和boost::iterator_range
。我在这里对这些术语感到困惑。谁能解释一下两者之间的区别以及何时使用什么?此外,如果您能指出我使用 boost range 库的示例示例来了解更多关于它的信息,那将是很好的。
问问题
11606 次
2 回答
10
谁能解释一下两者之间的区别以及何时使用什么?
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)
返回范围。
考虑以下示例:
#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 库来了解更多关于它的示例示例,那将是很好的,除了文档
如需快速总结 - 请查看此幻灯片
于 2012-11-08T13:43:22.710 回答
4
通常,您不会boost::range_iterator
直接使用,因为它是一个模板元函数,它接受给定的范围(不管范围的类型),并返回它的 begin()/end() 方法的类型。
boost::iterator_range
用于从一对预先存在的迭代器中创建一个新范围。这将更有可能使用,通常在获取仍然基于迭代器的代码并使用它转换为范围时。
于 2012-11-08T13:44:33.990 回答