boost :: iterator_range的rbegin()

时间:2012-06-22 11:28:48

标签: c++ boost iterator reverse traversal

我重构了一个使用单个元素列表的类,所以它现在使用了这样的列表列表。 为了最大限度地减少派生类的更改,我使用iterator实现了自定义boost::iterator_facade,并使用了一种方法来获取可用于迭代而不是原始列表的boost::iterator_range<iterator>

除了在使用rbegin()的地方外,这似乎有效。 boost::iterator_range似乎不支持此类内容。

获取范围最后一个元素的简单方法是什么?

我正在使用VS2008 SP1,即std :: tr1中只支持一些C ++ 11,而且显然也可以使用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 个答案:

答案 0 :(得分:1)

  1. 如果可能,一种解决方案是允许双向或随机访问遍历。这将允许您调用range.end() --(假设范围不为空)。这也允许您使用reversed增强范围适配器来反转范围。

  2. 另一种解决方案是使用begin()/end()std::distance获取迭代器,并使用std::advance确定两个迭代器之间的距离。然后你可以使用{{1}}一个小于距离的起始迭代器来移动到最后一个元素。