任何人都知道如何连接这两张地图:
map<string, map<string,string>> map1;
map<string, map<string,string>> map2;
我只想将map2
添加到map1
,并将所有元素保留在map1
中,即在map2
的末尾添加map1
。
我试过了map1.insert(map2.begin(), map2.end())
但是它没有用,因为它覆盖了map1
中的旧元素。
答案 0 :(得分:5)
如果你只想合并它们但是在碰撞的情况下保留map1中的元素,那么只需反转地图:
std::swap(map1, map2);
map1.insert(map2.begin(), map2.end());
这当然假设在合并之后,您只对结果感兴趣并且在旧集合中更长。
答案 1 :(得分:4)
地图&LT;&GT;一个键只能包含一个值。例如,尝试使用multimap<>。
答案 2 :(得分:1)
这个问题与地图的概念相矛盾。如果您在地图中插入一个值,您希望它位于“正确的位置”,具体取决于它的关键字。这意味着每个密钥只有一个条目。
相反,您可以使用vector< pair< mymap::key, myamap::value > >
并将其填入第一个resp的条目。第二张地图。
map< string, int > map1, map2;
... fill the maps
vector< pair<string, int> > concatted;
concatted.insert( map1.begin(), map1.end() );
concatted.insert( map2.begin(), map2.end() );
答案 3 :(得分:1)
使用简单的for循环执行:(通过我喜欢使用合理的stl算法):
for(std::map<...>::const_iterator it = map2.begin(), it_end = map2.end(); it != it_end; ++it)
map1.insert(*it);
任何其键已经在map1 中的元素都不会被覆盖,因为map::insert
不会覆盖。
答案 4 :(得分:1)
如果地图不是太大,请执行相反的操作:
map2.insert(map1.begin(), map1.end());
map1 = map2;
这会覆盖map2
中的重复值,但会保留map1
中的重复值(我明白这就是您想要的)。
答案 5 :(得分:0)
由于C++17 std::map
提供了merge()
成员函数,因此您可以简单地调用map1.merge(map2);
。请注意,地图是按其键排序的,因此不必在末尾附加元素。另外,由于映射中的键是唯一的,因此并非map2
中的所有元素都可以插入map1
中。完整示例:
int main() {
std::map<std::string, std::map<std::string, std::string>> map1{
{"a", {{"b", "b"}}}, {"b", {{"c", "c"}}}
};
std::map<std::string, std::map<std::string, std::string>> map2{
{"b", {{"x", "x"}}}, {"c", {{"y", "y"}}}
};
map1.merge(map2); // C++17
std::cout << "map1:" << std::endl;
for (auto const &kv : map1)
std::cout << kv.first << ": " << kv.second.begin()->first << std::endl;
std::cout << std::endl << "map2:" << std::endl;
for (auto const &kv : map2)
std::cout << kv.first << ": " << kv.second.begin()->first << std::endl;
return 0;
}
输出:
map1:
a:b
b:c
c:ymap2:
b:x
如您所见,键重叠时,merge()
不会覆盖目标映射map1
中的现有元素。如果要优先考虑map2
中的元素,则必须调用map2.merge(map1);
。您还可以看到,merge()
将条目从源映射中移出。无法合并的元素保留在map2
中。