编辑原始问题,因为我想问一下关于std :: map的问题,而不是std :: vector.我的错.抱歉.
我的数据实际上是2 std :: maps.我想将两张地图合并到第三张地图中.
我的第一张和第二张地图包含具有相同键的条目.所以我想将这些键下的数据合并到我生成的第3张地图中.
所以如果我使用std :: merge,我会丢失第一个或第二个映射公共条目的数据吗?正如我所提到的,两张地图都有共同的数据(值)?
解决方法
顺序容器的信息
如果向量(或列表或双端队列等其他顺序容器)进行排序,则可以使用std::set_union
.如果要保存重复项,则为std::merge
#include <vector> #include <iostream> #include <algorithm> #include <iterator> int main() { std::vector<int> v1 = {1,2,3,4,5}; std::vector<int> v2 = { 3,5,6,7}; std::vector<int> dest1; std::set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),std::back_inserter(dest1)); for (const auto &i : dest1) { std::cout << i << ' '; } std::cout << '\n'; }
输出:1 2 3 4 5 6 7
关联容器的信息
您可以使用insert方法向地图(或集合及其无序对应项)添加唯一键.原始地图中已存在的任何密钥都不会被替换(在多重插图和多地图重复键中将添加,如果应该避免,请使用之前讨论过的set_union).
映射示例(忽略具有重复键的条目):
#include <map> #include <iostream> int main() { std::map<int,int> v1 = {{1,1},{2,{3,{4,{5,1}}; std::map<int,int> v2 = { {3,2},{6,{7,2}}; std::map<int,int> dest1 = v1; dest1.insert(v2.begin(),v2.end()); for (const auto &i : dest1) { std::cout << i.first << ':' << i.second << ' '; } std::cout << '\n'; }
输出(第一个数字是关键,第二个 – 它来自哪个地图):1:1 2:1 3:1 4:1 5:1 6:2 7:2
如果您切换地图(将dest1设置为开头的v2副本和v1的inser值),则输出将为:1:1 2:1 3:2 4:2 5:2 6:2 7:2
多映射的示例(保留两个映射的条目):
#include <map> #include <iostream> int main() { std::map<int,2}}; std::multimap<int,int> dest1 {v1.begin(),v1.end()}; dest1.insert(v2.begin(),v2.end()); for (const auto &i : dest1) { std::cout << i.first << ':' << i.second << ' '; } std::cout << '\n'; }
输出:1:1 2:1 3:1 3:2 4:1 4:2 5:1 5:2 6:2 7:2
请注意,您不能使用与地图完全相同的多地图.例如,operator []是不可用的.您将需要使用insert来添加条目,并使用lower_bound或equal_range成员函数来提取条目.