Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不改变元素顺序的情况下合并两个无序的_映射?_C++_Dictionary_Merge_Stl_Unordered Map - Fatal编程技术网

C++ 如何在不改变元素顺序的情况下合并两个无序的_映射?

C++ 如何在不改变元素顺序的情况下合并两个无序的_映射?,c++,dictionary,merge,stl,unordered-map,C++,Dictionary,Merge,Stl,Unordered Map,我需要在不更改顺序的情况下合并两个未排序的映射。 比如说, unordered_map<int,int> map1 ,map2, map3; 无序地图map1、map2、map3; map1包含: map2包含: 要与map3合并的map1和map2 所以我的map3应该包含 map::iterator it=map3.begin(); std::merge(map1.begin(),map1.end(),map2.begin(),map2.end(),inserter(map3

我需要在不更改顺序的情况下合并两个未排序的映射。 比如说,

unordered_map<int,int> map1 ,map2, map3;
无序地图map1、map2、map3;
map1包含:

map2包含:

要与map3合并的map1和map2

所以我的map3应该包含

map::iterator it=map3.begin();
std::merge(map1.begin(),map1.end(),map2.begin(),map2.end(),inserter(map3,it));
但map3的顺序仍在变化。
我试过使用std::merge和insert,但没有按照上面的要求工作。有人能帮我吗。还是我在合并和插入时犯了一些错误?

地图元素的顺序取决于它的键和平衡树算法,而不是源地图元素的顺序。如果要保存顺序,请改用
std::vector

地图元素的顺序取决于其键和平衡树算法,而不是源地图元素的顺序。如果要保存顺序,请使用
std::vector

std::unordered\u map
不保证任何类型的顺序,而
std::map
始终按键排序(尽管您可以指定自己的比较函数)。看起来您希望项目按其插入顺序排列。在这种情况下,您可以将数据推送到
std::vector
,尽管您必须放弃映射类型提供的次线性操作。

std::unordered\u map
不保证任何类型的顺序,而
std::map
始终按键排序(尽管您可以指定自己的比较函数)。看起来您希望项目按其插入顺序排列。在这种情况下,您可以将数据推送到
std::vector
,尽管您必须放弃映射类型提供的子线性操作。

std::merge在假定两个已排序的范围的情况下工作(在您的情况下是两个未排序的映射)实现线性时间性能。由于它的实现,使用未排序的映射不会给出所需的结果。

std::merge在假设两个已排序的范围(在您的情况下是两个未排序的映射)的情况下工作实现线性时间性能。由于它的实现,使用未排序的映射将不会给出所需的结果。

那么你的意思是,无序映射将在插入时对键进行某种排序?不。在实践中,
std::unordered\u map
是一个。我不确定该标准如何明确地指定它,但它确实像一个h表和嘎嘎声就像一个哈希表。它可能会按照哈希的排序顺序(并且,在同一个哈希桶中,按照插入的顺序)进行迭代,但这肯定不能保证。所以当你从
开始
结束
迭代时,你可以依靠点击所有元素,但基本上就是这样。所以你的意思是,无序映射在插入时会对键进行某种排序?不。实际上
std::无序映射
是一个。我不确定标准有多明确d指定它,但它肯定像哈希表一样运行,像哈希表一样嘎嘎作响。它可能会按照哈希的排序顺序(并且在同一个哈希桶中,按照插入的顺序)进行迭代所以当你从
开始
迭代到
结束
时,你可以依靠点击所有元素,但基本上就是这样。
map<int,int>::iterator it   = map3.begin();
std::merge(map1.begin(),map1.end(),map2.begin(),map2.end(),inserter(map3,it));