c++ - boost::iterator_range 的 rbegin()

标签 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. 如果可能,一个解决方案是允许双向或随机访问遍历。这将允许您调用 range.end() -- (假设范围不为空)。这还允许您使用 reversed boost 范围适配器来反转范围。

  2. 另一种解决方案是使用 begin()/end() 从范围中获取迭代器,并使用 std::distance 确定之间的距离两个迭代器。然后,您可以使用 std::advance 开始迭代器,该迭代器比移动到最后一个元素的距离小一个。

关于c++ - boost::iterator_range 的 rbegin(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155322/

相关文章:

c++ - 从 std::cin 读取二进制数据

c++ - CMAKE指定不同的源目录

boost - 传递给 boost::asio::async_read_some 的回调在 boost::asio::read_some 返回数据的使用中从未被调用

java - java 堆迭代器

c++ - std::istreambuf_iterator "peek"与 std::ifstream

c++ - Top Down Shooter 中 0x000FBA44 处的未处理异常

c++ - 部署使用外部库的应用程序的正确构建选项

c++ - std::vector 中的数据存储是连续的吗?

c++ - 关于 auto 作为参数类型,C++14 标准是怎么说的

c++ - bjam,如何找到 boost 构建