【发布时间】:2011-10-08 13:05:42
【问题描述】:
考虑以下简化示例和所需的输出:
class A
{
class combined_iterator
{
????
}
typedef ??? t_combined_it;
t_combined_it begin();
t_combined_it end();
std::vector<int> m_Vec1, m_Vect2;
}
A a;
a.m_Vec1.push_back(1);
a.m_Vec2.push_back(2);
for (A::t_combined_it it = a.begin() ; it != a.end() ; it++) {
std::cout << *it << " ";
}
输出:
1 2
我认为这个问题很清楚:我如何编写一个迭代器,使它看起来好像两个或多个其他迭代器实际上只是一个序列。因此,在示例中,我可以使用一个迭代器,它首先迭代 m_Vec1 的元素,然后是 m_Vec2 的元素,而不是同时迭代 m_Vec1 和 m_Vec2。
我发现了以下问题,我认为它提出了相同的问题:Make a c++ iterator that traverses 2 containers。这个问题没有好的答案;原始提问者提出的解决方案似乎很复杂,而且(相对)占用大量内存。
我尝试了一种简单的方法,将 std::vector::iterator 保留为我的自定义迭代器的成员,并将其与被迭代的每个序列的 .end() 迭代器进行比较;然而,比较来自不同容器的迭代器似乎是非法的(我希望它们只是返回“不相等” - 也许这是寻找解决这个问题的方向?我想不出如何不过要实现它)。
在可能且相关的情况下,我想使用 boost::iterators,就像我在其他地方使用它们一样,我喜欢它为我的迭代器实现提供的同质性;但当然,如果有人有想法但不使用它们,我可以自己实现它们,所以从这个意义上说,它们不是必需的。
【问题讨论】: