gpt4 book ai didi

c++ - 迭代封装的嵌套 STL 容器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:54 25 4
gpt4 key购买 nike

这是一个相当正常的 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 方法。

我不清楚该怎么做,但我怀疑它涉及编写自定义迭代器。有什么想法吗?

最佳答案

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

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

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

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已经涵盖了相同的领域。

关于c++ - 迭代封装的嵌套 STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com