2012-06-22 60 views
0

我重構了一個使用單個元素列表的類,所以它現在使用這樣的列表的列表。 爲了最大限度地減少派生類中的更改,我使用boost::iterator_facade實現了一個自定義iterator,並且還獲得了可用於迭代而不是原始列表的boost::iterator_range<iterator>的方法。rbegin()的一個boost :: iterator_range

除了在使用rbegin()的地方,這似乎可以工作。 boost::iterator_range似乎不支持這樣的東西。

什麼是獲得範圍的最後一個元素的簡單方法?

我正在使用VS2008 SP1,即只有一些C++ 11支持std :: tr1,並且boost也顯然可用。

typedef std::deque<MyData> DataList; 

class MyClass : private boost::noncopyable 
{ 
public: 
    void AppendData(DataList* newData  

private: 
    typedef std::deque<DataList*> ListOfDatatLists; 

    /** 
    * Custom iterator. 
    * The content is not meant to be modified so this iterator operates on const lists only. 
    */ 
    class iterator 
     : public boost::iterator_facade < 
     iterator, 
     MyData, 
     boost::forward_traversal_tag // Only forward iteration necessary 
     > 
    { 
    public: 
     static boost::iterator_range<iterator> range(const ListOfDataLists * pListOfLists); 

    private: 
     friend class boost::iterator_core_access; 

     iterator(const ListOfDataLists * pListOfLists = NULL) : m_pListOfLists(pListOfLists) {} 

     /// \name Implementations for boost base class 
     //{@ 
     bool equal(iterator const & other) const; 
     MyData & dereference() const; 
     void increment(); 
     difference_type distance_to(const iterator & other) const; 
     //@} 

     const ListOfDataLists * m_pListOfLists; 
     ListOfDataLists::const_iterator m_listIt; ///< The current list of data items 
     DataList::const_iterator m_dataIt; ///< An iterator of the current list 
    }; 


    ListOfResultLists m_dataLists; 


protected: 
    typedef std::tr1::shared_ptr<CLockedResults> SpLockedResults; 

    /// For use by derived classes instead of the former single list 
    boost::iterator_range<iterator> GetData() const; 
}; 

回答

1
  1. 一種解決方案,如果可能,是允許雙向或隨機存取遍歷。這將允許您撥打電話range.end() --(假設範圍不是空的)。這也可以讓您使用reversed升壓範圍適配器來反轉範圍。

  2. 另一種解決方案是使用begin()/end()std::distance來獲得範圍內的迭代器,以確定兩個迭代器之間的距離。然後你可以使用std::advance開始迭代器比移動到最後一個元素的距離小1。

+0

感謝您的回答!我去了雙向迭代器。 – foraidt

相關問題