联合迭代器的地图? [英] Union iterator for maps?
问题描述
前言像 std :: map
这样的关联C ++容器有点像微数据库,只有一个键列。 Boost的 bimap
将这个提升为一个两列的表,在这两列中都有查找,但这就是类比 - 没有polymap概括的想法。 ]
[Preface: The associative C++ containers like std::map
are a bit like micro-databases with just one key column. Boost's bimap
elevates this to a two-column table with lookup in both columns, but that that's as far as the analogy goes -- there's no "polymap" that generalizes the idea.]
无论如何,我想继续把地图视为数据库,现在我想知道是否有一个迭代器(或其他解决方案)允许我做一个UNION的几个成分映射。也就是说,所有的映射都具有相同的类型(或者值类型和比较器,至少),我想要一个迭代器,将整个集合作为一个大的多重映射(重复键是OK),让我在正确的联合
In any event, I want to keep thinking of maps as databases, and I now wonder if there is an iterator (or some other solution) that allows me to do a UNION of several constituent maps. That is, all maps have the same type (or value type and comparator, at least), and I want a single iterator that treats the entire collection as a big multimap (repeated keys are OK) and lets me traverse it in the correct unioned order.
这样的事情是否存在,也许在Boost内?或者是容易装备一个?在伪代码中:
Does such a thing exist, perhaps within Boost? Or is it easy to rig one up? In pseudo code:
std::map<K, M> m1, m2;
union_iterator<K, M> u(m1, m2)
for(auto it = u.begin(); it != u.end(); ++it) { /* ... */ }
例如,如果我们有:
m1 = { { 9:00, "Check in"}, { 12:00, "Break" }, { 16:00, "Check out"} };
m2 = { { 10:30, "coffee" }, { 12:15, "baked beans" }, { 15:00, "lies" } };
然后我想迭代器产生:
9:00, "Check in"; 10:30, "coffee"; 12:00, "Break"; 12:15, "baked beans"; ...
推荐答案
由于宣布,我有一些很酷的东西。
As I announced, I have got something pretty cool.
我现在发布,因为我不知道我是否会回来时间今晚发布。我会花几个字来解释。 (在此后)
I'm posting it now, because I wouldn't be sure whether I'd be back in time tonight to post it. I will be spending a few words in explanation. (in this post)
PS。包含将被修剪掉(约20%我可能会在代码上做一些更一般的工作。
PS. The includes will be trimmed down (to about 20%); I will probably do some more general work on the code too.
很多可以说这个代码:它不是很有效率,而不是很干净(还)。然而,它几乎是无限泛型的,应该像任何其他的。所有代码都可以在github中找到:
A lot can be said about this code: it is not very efficient, and not very clean (yet). It is, however, nearly infinitely generic and should scale like anything else. All code can be found in a github gist:
- merge_maps_iterator.hpp
- Makefile
- test.cpp < a> - 一个相当神秘的测试用例集合,显示一般性(我不是说这将是一个好主意要使用ints和float (更不用说同时) - 只是表明它可以完成)
- merge_maps_iterator.hpp
- Makefile
- test.cpp - a rather arcane set of test-cases showing off the genericity
(I'm not saying that it would be a good idea to have maps keyed with ints and floats (let alone both at the same time) - just showing that it can be done)
test.cpp,你可以找到它:
Here is the output of the test.cpp as you can find it:
== input ========================================
{ 2, aap } { 23, mies } { 100, noot } { 101, broer }
{ b, 3.14 }
== output =======================================
2: aap;
23: mies;
98: 3.14;
100: noot;
101: broer;
== input ========================================
{ b, 3.14 }
{ 2, aap } { 23, mies } { 100, noot } { 101, broer }
== output =======================================
2: aap;
23: mies;
98: 3.14;
100: noot;
101: broer;
== input ========================================
{ 2, aap } { 23, mies } { 100, noot } { 101, broer }
{ 2, aap } { 23, mies } { 100, noot } { 101, broer }
== output =======================================
2: aap;aap;
23: mies;mies;
100: noot;noot;
101: broer;broer;
== input ========================================
{ b, 3.14 }
{ b, 3.14 }
== output =======================================
b: 3.14;3.14;
== input ========================================
{ 1.0, dag } { 22.0, bye } { 24.0, Tschüß }
{ 1, true } { 22, false } { 24, true }
{ b, 3.14 }
{ 2, aap } { 23, mies } { 100, noot } { 101, broer }
== output =======================================
1.0: dag;true;
2.0: aap;
22.0: bye;false;
23.0: mies;
24.0: Tschüß;true;
98.0: 3.14;
100.0: noot;
101.0: broer;
== input ========================================
{ 1.0, dag } { 2.0, EXTRA } { 22.0, bye } { 24.0, Tschüß }
{ 1, true } { 22, false } { 24, true }
{ b, 3.14 }
{ 2, aap } { 23, mies } { 100, noot } { 101, broer }
== output =======================================
1.0: dag;true;
2.0: EXTRA;aap;
22.0: bye;false;
23.0: mies;
24.0: Tschüß;true;
98.0: 3.14;
100.0: noot;
101.0: broer;
这篇关于联合迭代器的地图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!