包装地图迭代器的地图

时间:2014-03-10 00:41:29

标签: c++ c++11 iterator

我有一个主要包装map<int, map<int, Stuff>>的C ++类,我发现它比map<pair<int, int>, Stuff>更有效。但是,我希望迭代器接口是后一种风格的接口。

例如,我希望能够做到以下几点:

for (const auto& loc_to_stuff : instance) {
  pair<int, int> loc = loc_to_stuff.first;
  int src = loc.first;
  int dst = loc.second;
  ...
}

1 个答案:

答案 0 :(得分:1)

我不确定C ++在这里为你提供了很多帮助:你只需要实现一个迭代器。

请记住,迭代器只是具有特定成员的类。迭代器是一个包含运算符*->==!=++的类,如果您可以返回并且/可能还有一些或做随机搜寻。

在内部,迭代器会将两个迭代器保存到地图中,map<int, map<int, Stuff>>::iterator(“外部”迭代器)和map<int, Stuff>::iterator(“内部”迭代器)。

++将尝试递增内部迭代器,如果失败,则递增外部迭代器,并在外部迭代器指向的地图上启动内部迭代器。类似的东西:

iterator &operator ++ () {
    ++m_inner;
    // if we've reached the end of the inner iterator,
    // find the next non-empty map, and start iterating through it.
    // Stop if we read the end of the outer map.
    // (we're pointing to end() of the whole thing._
    while(m_inner == m_outer->end() && m_outer != m_outer_end) {
        ++m_outer;
        m_inner = m_outer->begin();
    }
}

(循环用于跳过空地图。请注意,begin实施中需要一个类似的循环。)

在您的主类上,您还需要beginend(const和非const)的实现。

一旦你理解了迭代器只是普通的对象,其他运算符都是微不足道的。

希望您能看到为什么这可能需要处理一些代码:您可以考虑一些关于使用其他地图类型(map<pair<int, int>, Stuff>)的意见建议,这些意见只会让您{{1} }。