我重构了一个使用单个元素列表的类,因此它现在使用这样的列表的列表。
为了尽量减少派生类的变化,我实现了一个自定义 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;
};
最佳答案
如果可能,一个解决方案是允许双向或随机访问遍历。这将允许您调用
range.end() --
(假设范围不为空)。这还允许您使用reversed
boost 范围适配器来反转范围。另一种解决方案是使用
begin()/end()
从范围中获取迭代器,并使用std::distance
确定之间的距离两个迭代器。然后,您可以使用std::advance
开始迭代器,该迭代器比移动到最后一个元素的距离小一个。
关于c++ - boost::iterator_range 的 rbegin(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155322/