2012-06-22 30 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

相关问题