用于地图的联合迭代器?

Ker*_* SB 8 c++ iterator map

[ 前言:关联的C++容器std::map有点像只有一个关键列的微数据库.Boost bimap将它提升为一个两列的表,在两列中都有查找,但这就像这个类比一样 - 没有"polymap"概括了这个想法.

无论如何,我想继续将地图视为数据库,现在我想知道是否有一个迭代器(或其他解决方案)允许我做几个组成映射的UNION.也就是说,所有的地图都有相同的类型(或者至少是值类型和比较器),我想要一个迭代器将整个集合视为一个大的多重映射(重复的键都可以),让我在正确的联合中遍历它订购.

这样的事情是否存在,也许在Boost中?或者是否容易装备?在伪代码中:

std::map<K, M> m1, m2;
union_iterator<K, M> u(m1, m2)
for(auto it = u.begin(); it != u.end(); ++it) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

例如,如果我们有:

m1 = { { 9:00, "Check in"}, { 12:00, "Break" }, { 16:00, "Check out"} };
m2 = { { 10:30, "coffee" }, { 12:15, "baked beans" }, { 15:00, "lies" } };
Run Code Online (Sandbox Code Playgroud)

然后我想要迭代器生成:

9:00, "Check in"; 10:30, "coffee"; 12:00, "Break"; 12:15, "baked beans"; ...
Run Code Online (Sandbox Code Playgroud)

Mar*_*tos 9

有一个"polymap":Boost.MultiIndex.

  • 我一直认为multiindex只会在*first*列(即键)上给出不同的视图.我错了吗?你能把一个合适的数据库作为多索引吗? (2认同)

seh*_*ehe 2

正如我所宣布的,我得到了一些很酷的东西。

\n\n

我现在发布它,因为我不确定今晚是否能及时回来发布它。我花几句话进行解释。(在这篇文章中)

\n\n
\n

附言。包含内容将被削减(至约 20%);我可能也会对代码做一些更一般的工作。

\n
\n\n

关于这段代码可以说很多:它不是很高效,而且还不是很干净。然而,它几乎是无限通用的,并且应该像其他任何东西一样扩展。所有代码都可以在 github gist 中找到:

\n\n
    \n
  • merge_maps_iterator.hpp
  • \n
  • 生成文件
  • \n
  • test.cpp - 一组相当神秘的测试用例,展示了通用性
    (我并不是说用整数和浮点数键控地图是一个好主意(更不用说同时两者) - 只是显示这是可以做到的)
  • \n
\n\n

您可以找到 test.cpp 的输出:

\n\n
 == input ========================================\n{ 2, aap }      { 23, mies }    { 100, noot }   { 101, broer }  \n{ b, 3.14 }     \n == output =======================================\n     2: aap;\n    23: mies;\n    98: 3.14;\n   100: noot;\n   101: broer;\n\n == input ========================================\n{ b, 3.14 }     \n{ 2, aap }      { 23, mies }    { 100, noot }   { 101, broer }  \n == output =======================================\n     2: aap;\n    23: mies;\n    98: 3.14;\n   100: noot;\n   101: broer;\n\n == input ========================================\n{ 2, aap }      { 23, mies }    { 100, noot }   { 101, broer }  \n{ 2, aap }      { 23, mies }    { 100, noot }   { 101, broer }  \n == output =======================================\n     2: aap;aap;\n    23: mies;mies;\n   100: noot;noot;\n   101: broer;broer;\n\n == input ========================================\n{ b, 3.14 }     \n{ b, 3.14 }     \n == output =======================================\n     b: 3.14;3.14;\n\n == input ========================================\n{ 1.0, dag }    { 22.0, bye }   { 24.0, Tsch\xc3\xbc\xc3\x9f }\n{ 1, true }     { 22, false }   { 24, true }    \n{ b, 3.14 }     \n{ 2, aap }      { 23, mies }    { 100, noot }   { 101, broer }  \n == output =======================================\n   1.0: dag;true;\n   2.0: aap;\n  22.0: bye;false;\n  23.0: mies;\n  24.0: Tsch\xc3\xbc\xc3\x9f;true;\n  98.0: 3.14;\n 100.0: noot;\n 101.0: broer;\n\n == input ========================================\n{ 1.0, dag }    { 2.0, EXTRA }  { 22.0, bye }   { 24.0, Tsch\xc3\xbc\xc3\x9f }\n{ 1, true }     { 22, false }   { 24, true }    \n{ b, 3.14 }     \n{ 2, aap }      { 23, mies }    { 100, noot }   { 101, broer }  \n == output =======================================\n   1.0: dag;true;\n   2.0: EXTRA;aap;\n  22.0: bye;false;\n  23.0: mies;\n  24.0: Tsch\xc3\xbc\xc3\x9f;true;\n  98.0: 3.14;\n 100.0: noot;\n 101.0: broer;\n
Run Code Online (Sandbox Code Playgroud)\n