升压范围库:顺序遍历两个范围
时间:2020-03-06 14:54:47 来源:igfitidea点击:
Boost范围库(http://www.boost.org/doc/libs/1_35_0/libs/range/index.html)使我们可以将一对迭代器抽象为一个范围。现在,我想将两个范围合并为一个范围,即:
给定两个范围r1和r2,定义遍历[r1.begin(),r1.end()[和然后[r2.begin(),r2.end()[]的r。有什么方法可以使用r1和r2将r定义为范围?
解决方案
我认为我们必须创建一个自定义的迭代器,当到达r1.end()时,它将把r1.end()滚动到r2.begin()。然后,该迭代器的Begin()和end()将合并到范围r中。 AFAIK没有标准的增强功能,可以为我们提供这种功能。
- 我们不能两次调用该函数,一次在两个范围内调用一次吗?还是这种方法有问题?
- 将两个范围复制到一个容器中并将其传递。
- 编写我们自己的范围类,因此首先遍历r1,然后遍历r2.
我再次需要这个,所以我再看了一下。有一种使用boost / range / join.hpp连接两个范围的方法。不幸的是,输出范围类型未包含在界面中:
#include "boost/range/join.hpp" #include "boost/foreach.hpp" #include <iostream> int main() { int a[] = {1, 2, 3, 4}; int b[] = {7, 2, 3, 4}; boost::iterator_range<int*> ai(&a[0], &a[4]); boost::iterator_range<int*> bi(&b[0], &b[4]); boost::iterator_range< boost::range_detail:: join_iterator<int*, int*, int, int&, boost::random_access_traversal_tag> > ci = boost::join(ai, bi); BOOST_FOREACH(int& i, ci) { std::cout << i; //prints 12347234 } }
我使用编译器消息找到了输出类型。 C ++ 0xauto
也将在那里相关。