我有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的元素中减少向量。
答案 0 :(得分:0)
您可以在声明它时使用map
提供您自己的Compare
类(模板定义的第三个参数)。然后你可以自由地使用range insert
并使用正确的迭代器(你知道方法begin
,end
)回读你的有序元素。
map
的内部表示是按合同隐式排序的,因此您不必关心如何插入元素,而应提供有效的函数来比较它们。
事实上,您的馆藏已经过排序,但我猜它们没有相应的排序(我的意思是,集合C1
包含遍布集合C2
内的元素,不保证它们会被连续放置,是吗?。