【发布时间】:2011-11-10 21:45:24
【问题描述】:
[前言: 像std::map 这样的关联 C++ 容器有点像只有一个键列的微型数据库。 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) { /* ... */ }
例如,如果我们有:
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"; ...
【问题讨论】:
-
我认为您需要完全相同类型的映射来实现这样的迭代器,因为无论如何它都必须取消对
std::pair <key, value>的引用。 -
@Nicolas:如果容器有不同的分配器,我可能会没问题,至少如果 UNION 迭代器是只读的......当然是值类型(回想一下值类型 是对,我没有说“映射类型”)和比较器必须同意。
-
抱歉,我将“值类型和比较器”误读为“键类型和比较器”,我以为您打算使用相同的键和不同的值类型...编辑:好的!我认为作为“键/值对”的映射,所以我误解了。我的错。
-
请注意,迭代器的
++运算符或每个元素的等价预处理量必须是O(log n),n是“多个”(映射的数量)。否则,您可以使用它在小于O(n log n)的时间内执行排序。装配一个实际上是执行n-way 合并,这对于n=2来说很容易,如示例中所示,否则有点繁琐。 -
不是多张地图(每个“类别”数据一个),您能否拥有一张带有额外“类别”列的大地图?如果是这样,那么您可以使用
boost::multi_index,它应该允许您遍历整个数据集。