如何连接以下两个地图?
map<string, map<string,string>> map1;
map<string, map<string,string>> map2;
我只想添加map2
并map1
保留所有元素已经在 中map1
,即添加map2
在map1
. 我试过map1.insert(map2.begin(), map2.end())
了,但它不起作用,因为它会覆盖map1
.
如何连接以下两个地图?
map<string, map<string,string>> map1;
map<string, map<string,string>> map2;
我只想添加map2
并map1
保留所有元素已经在 中map1
,即添加map2
在map1
. 我试过map1.insert(map2.begin(), map2.end())
了,但它不起作用,因为它会覆盖map1
.
如果您只想合并它们,但如果发生冲突,请保留 map1 中的元素,那么只需反转地图:
std::swap(map1, map2);
map1.insert(map2.begin(), map2.end());
这当然假设在合并之后,您只对结果感兴趣,而不再对旧集合感兴趣。
map<> 只能包含一个键的一个值。例如,尝试使用multimap<>。
这个问题与地图的概念相矛盾。如果您在地图中插入一个值,您希望它位于“正确的位置”,具体取决于它的键。这意味着每个键只有一个条目。
相反,您可以使用 avector< pair< mymap::key, myamap::value > >
并用第一个相应的条目填充它。第二张地图。
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() );
用一个简单的for循环来做:(虽然我喜欢在合理的地方使用stl算法):
for(std::map<...>::const_iterator it = map2.begin(), it_end = map2.end(); it != it_end; ++it)
map1.insert(*it);
任何其键已经在 map1 中的元素都不会被覆盖,因为map::insert
不会被覆盖。
如果地图不是太大,则相反:
map2.insert(map1.begin(), map1.end());
map1 = map2;
这将覆盖 中的重复值map2
,但会保留其中的值map1
(我知道这是您想要的)。
由于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;
}
输出:
地图1:
a:b
b:c
c:y地图2:
b:x
如您所见,当键重叠时,merge()
不会覆盖目标映射中的现有元素。map1
如果你想优先考虑元素 from map2
,那么你必须调用map2.merge(map1);
. 您还可以看到,merge()
将条目从源映射中移出。无法合并的元素保留在map2
.