我有一个主要包装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;
...
}
答案 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
实施中需要一个类似的循环。)
在您的主类上,您还需要begin
,end
(const和非const)的实现。
一旦你理解了迭代器只是普通的对象,其他运算符都是微不足道的。
希望您能看到为什么这可能需要处理一些代码:您可以考虑一些关于使用其他地图类型(map<pair<int, int>, Stuff>
)的意见建议,这些意见只会让您{{1} }。