1

如何连接以下两个地图?

map<string, map<string,string>> map1;
map<string, map<string,string>> map2;

我只想添加map2map1保留所有元素已经在 中map1,即添加map2map1. 我试过map1.insert(map2.begin(), map2.end())了,但它不起作用,因为它会覆盖map1.

4

6 回答 6

6

如果您只想合并它们,但如果发生冲突,请保留 map1 中的元素,那么只需反转地图:

std::swap(map1, map2);
map1.insert(map2.begin(), map2.end());

这当然假设在合并之后,您只对结果感兴趣,而不再对旧集合感兴趣。

于 2010-06-09T11:30:18.723 回答
4

map<> 只能包含一个键的一个值。例如,尝试使用multimap<>

于 2010-06-09T11:20:33.457 回答
1

这个问题与地图的概念相矛盾。如果您在地图中插入一个值,您希望它位于“正确的位置”,具体取决于它的键。这意味着每个键只有一个条目。

相反,您可以使用 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() );
于 2010-06-09T11:20:51.927 回答
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不会被覆盖。

于 2010-06-09T11:22:56.443 回答
1

如果地图不是太大,则相反:

map2.insert(map1.begin(), map1.end());
map1 = map2;

这将覆盖 中的重复值map2,但会保留其中的值map1(我知道这是您想要的)。

于 2010-06-09T11:26:35.390 回答
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;
}

输出:

地图1:
a:b
b:c
c:y

地图2:
b:x

如您所见,当键重叠时,merge()不会覆盖目标映射中的现有元素。map1如果你想优先考虑元素 from map2,那么你必须调用map2.merge(map1);. 您还可以看到,merge()将条目从源映射中移出。无法合并的元素保留在map2.

Coliru 上的代码

于 2019-09-16T11:35:09.850 回答