将已排序的集合与地图合并

时间:2015-07-30 06:08:57

标签: c++ algorithm c++11 containers

我有n个(比如三个)排序的键值集合。合并它们的最简单方法是使用std :: map。简单。但是,因为有分类,值得考虑的是迭代一个集合并在适当的位置插入第二个集合中的对,而不是使用map :: insert,它总是会有O(n log n)。所以在我看来,最好的情况是使用std :: list和std :: pair。我还考虑使用std :: vector和索引上的一些maping键以及使用new vector合并集合,但是它会更复杂。

这种思维方式有意义吗?或者是否有任何有效的方法在这样的任务中使用地图。

谢谢。

修改

示例:

{{60: 1},    {{75: 4},     {{100: 3}, 
 {70: 5},     {80: 2},      {120: 9},
 {80: 4}      {85: 4}}      {140: 7}}
 {90: 9}}

如果有帮助,输入的一般模式是:

{{offset: random0}, 
 {offset + 1 * k: random1}, 
 {offset + 2 * k: random2}, 
 {offset + 3 * k: random3}, 
 {offset + 4 * k: random4}, ... }

{offset: random0}表示范围<offset, offset + 1 * k)中的每个元素值等于random0

输出应为:

{{60: 1},
 {70: 5},
 {75: 9},  //{70: 5} + {75: 4}
 {80: 6},  //{80: 4} + {80: 2}
 {85: 8},  //{80: 4} + {85: 4}
 {90: 9},
 {100: 3},
 {120: 9},
 {140: 7}}

最后,我考虑使用vector:

int upper_bound = 200;
vector<unsigned int> v(upper_bound, 0);

然后遍历每个地图,并在向量中增加适当的元素。如果键超出限制,我将简单地调整向量。然后我将从等于0的元素中减少向量。

1 个答案:

答案 0 :(得分:0)

您可以在声明它时使用map提供您自己的Compare类(模板定义的第三个参数)。然后你可以自由地使用range insert并使用正确的迭代器(你知道方法beginend)回读你的有序元素。

map的内部表示是按合同隐式排序的,因此您不必关心如何插入元素,而应提供有效的函数来比较它们。

事实上,您的馆藏已经过排序,但我猜它们没有相应的排序(我的意思是,集合C1包含遍布集合C2内的元素,不保证它们会被连续放置,是吗?。