【问题标题】:Iterator for 2 separated data structures2个分离数据结构的迭代器
【发布时间】:2019-01-03 16:36:21
【问题描述】:

我有一个图形类,其中有两个 std::map;这些地图是私有的,我希望用户只能循环浏览这两个地图,而不是修改它们。

关键是,(第一点是我从未编写过标准迭代器)它们必须看起来像只有一个来自外部的地图。

这样的代码看起来像:

for (auto element : stuff)
    {
    //do stuff
    }

实际上会这样做:

for (auto element : map_1)
    {
    }
for (auto element : map_2)
    {
    }

我如何管理第一张地图和第二张地图之间的步骤?

【问题讨论】:

  • 当然,制作你自己的迭代器,一旦你到达map_1.end(),将它设置为map_2.begin(),然后让你的最终迭代器只是map_2.end()
  • 哦,当解决方案就在您眼前,而您却没想到时……谢谢!
  • @NathanOliver 你必须知道迭代器是否指向map_1,才能知道它是否定义好与map_1.end()进行比较,所以并不是那么简单。

标签: c++ iterator stdmap


【解决方案1】:

在您的自定义迭代器中,存储两个字段:

struct example {
    unsigned map_index;
    map_iterator it;
};

map_index 告诉您正在迭代哪个地图。

在递增it后的递增运算符中,如果it == map_0.end()(我将编号更改为从零开始)则递增map_index并将it设置为map_1.begin()

使用{map_1.end(), 1} 作为结束迭代器。

在比较运算符中,首先比较 map_index,如果索引匹配,则仅比较 it


也就是说,您可以通过使用现有的通用功能为自己节省大量工作:boost::range::join

【讨论】:

  • 我现在更喜欢将自己限制在标准库中,但感谢您的建议,现在我只需要投入标准迭代器的世界
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多