【问题标题】:iterating encapsulated nested STL containers迭代封装的嵌套 STL 容器
【发布时间】:2011-10-03 18:36:45
【问题描述】:

这是一个相当普通的 STL 容器封装,它允许 Cfoo 的用户迭代容器而不允许更改内部结构。

#include <vector>

class Cfoo
{
public:
    class Cbar
    {
        /* contents of Cbar */
    };
    typedef std::vector<Cbar> TbarVector;
    typedef TbarVector::const_iterator const_iterator;     
public:
    const_iterator begin() const { return( barVector_.begin() ); }
    const_iterator end() const { return( barVector_.end() ); }
private:
    TbarVector barVector_;
};

到目前为止,一切都很好。我们可以像这样迭代容器:

Cfoo myFoo;
for (Cfoo::const_iterator it = myFoo.begin(); it != myFoo.end(); ++it)
{
   it->DoSomething();
}

现在我想用嵌套的 std::vector 替换 std::vector:

public:
    typedef std::vector<Cbar> TbarVectorInner;
    typedef std::vector<TbarVectorInner> TbarVectorOuter;

private:
    TbarVectorOuter barContainer_;

但我希望能够以与以前相同的方式迭代 Cbar 的所有实例,公开一个 const_iterator、一个 begin()const 和一个 end()const 方法。

我不清楚如何做到这一点,但我怀疑它涉及编写自定义迭代器。有什么想法吗?

【问题讨论】:

标签: c++ stl


【解决方案1】:

没有一个标准迭代器能够迭代多个容器,因此您的假设是正确的 - 您必须编写一个自定义迭代器。

如果您有一个中间迭代器,可以将成对的(开始,结束)迭代器返回到内部容器,则可以以通用方式执行此操作。

一些未经测试的代码开始使用:

template<typename T, typename OuterIterator, typename InnerIterator>
class Iterator2d : std::Iterator
{
public:
    Iterator2d(OuterIterator begin, OuterIterator end) : m_begin(begin), m_end(end), m_currentOuter(begin)    {
        if (m_currentOuter != m_end)
             m_currentInner = m_begin->first;
        Normalize();
    }
    Iterator2d & operator++()
    {
        if (m_currentOuter != m_end)
        {
            ++m_currentInner;
            Normalize();
        }
        return *this;
    }
    T & operator*()
    {
        return *m_currentInner;
    }
private:
    void Normalize()
    {
        while (m_currentOuter != m_end && m_currentInner == m_currentOuter->second)
        {
            ++m_currentOuter;
            if (m_currentOuter != m_end)
                m_currentInner = m_currentOuter->first;
        }
    }

    OuterIterator m_begin;
    OuterIterator m_end;
    OuterIterator m_currentOuter;
    InnerIterator m_currentInner;
};

这只是一个开始,我可能会回来完成它 - 或不,这取决于 this implementation 已经涵盖了相同的领域。

【讨论】:

  • operator++() 错过return *this
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多