gpt4 book ai didi

c++ - 编写一个使多个容器看起来像一个的迭代器

转载 作者:IT老高 更新时间:2023-10-28 21:50:46 35 4
gpt4 key购买 nike

考虑以下简化示例和所需的输出:

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,就像我在其他地方使用它们一样,我喜欢它为我的迭代器实现提供的同质性;但当然,如果有人有想法但不使用它们,我可以自己实现它们,所以从这个意义上说,它们不是必需的。

最佳答案

boost::join就是你要找的。您还可以研究实现,尤其是如何推导容器遍历、引用和返回值类型的最小公分母。引用:

The intention of the join function is to join two ranges into one longer range.

The resultant range will have the lowest common traversal of the two ranges supplied as parameters.

Note that the joined range incurs a performance cost due to the need to check if the end of a range > has been reached internally during traversal.

关于c++ - 编写一个使多个容器看起来像一个的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6747987/

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