簡體   English   中英

增強范圍庫:按順序遍歷兩個范圍

[英]Boost Range Library: Traversing Two Ranges Sequentially

Boost范圍庫( http://www.boost.org/doc/libs/1_35_0/libs/range/index.html )允許我們將一對迭代器抽象為一個范圍。 現在我想將兩個范圍合並為一個,即:

給定兩個范圍r1和r2,定義r遍歷[r1.begin(),r1.end()[然后[r2.begin(),r2.end()[。 有沒有辦法使用r1和r2將r定義為范圍?

我再次需要這個,所以我再看看。 有一種方法可以使用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 ++ 0x auto也與此相關。

  • 你不能兩次調用這個函數,一次是兩個范圍嗎? 或者這種方法有問題嗎?
  • 將兩個范圍復制到一個容器中並傳遞它。
  • 編寫自己的范圍類,因此它首先遍歷r1並通過r2秒迭代。

我認為你必須制作一個自定義迭代器,當達到r1.end()時,它會將r1.end()翻轉到r2.begin()。 然后,該迭代器的Begin()和end()將合並到您的范圍r中。 AFAIK沒有標准的提升功能會給你這種行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM