Roe*_*oel 20 c++ boost iterator
考虑以下简化示例和所需输出:
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 << " ";
}
Run Code Online (Sandbox Code Playgroud)
输出:
1 2
Run Code Online (Sandbox Code Playgroud)
我认为问题很清楚:我如何编写一个迭代器,使它看起来好像两个或多个其他迭代器实际上只是一个序列.因此,在示例中,我可以使用迭代器,而不是迭代m_Vec1和m_Vec2,迭代器首先迭代m_Vec1和m_Vec2的元素.
我发现以下问题我认为是相同的:创建一个遍历2个容器的c ++迭代器.这个问题没有好的答案; 原始提问者提出的解决方案似乎很复杂,而且(相对)内存密集型.
我通过将std :: vector :: iterator保持为我的自定义迭代器的成员,并将其与迭代的每个序列的.end()迭代器进行比较,尝试了一种天真的方法; 然而,似乎比较来自不同容器的迭代器是非法的(我希望它们只是为了返回'不相等' - 也许这是找到这个问题的解决方案的方向?我想不出如何但是要实现它.
在可能的情况下,如果相关,我想使用boost :: iterators,因为我在别处使用它们,我喜欢它为我的迭代器实现提供的同质性; 但是当然如果有人在不使用它们的情况下有想法,我可以自己动手,所以在这个意义上它们不是必需的.
Seb*_*ian 19
boost :: join是你正在寻找的.您还可以研究实现,尤其是如何为容器遍历,引用和返回值类型派生最小公分母.报价:
连接功能的目的是将两个范围连接到一个更长的范围.
结果范围将具有作为参数提供的两个范围的最低公共遍历.
请注意,由于需要在遍历期间检查是否已在内部达到范围的结束,因此连接范围会产生性能成本.
我认为你的"天真"方法应该有效,并进行以下更改:不是将迭代器与end()每个容器的迭代器进行比较,而是保持指向当前容器的指针,并仅将迭代器与当前容器进行比较end().到达终点时,继续前进到下一个容器.这样,你永远不会将迭代器与另一个容器进行比较,而不是它所指向的容器.这也很容易推广到任意大小的集合集合.
| 归档时间: |
|
| 查看次数: |
5229 次 |
| 最近记录: |