编辑原始问题,因为我想问问题std::map,而不是std::vector.我的错.抱歉.
我的数据实际上是2 std::map秒.我想将两张地图合并到第三张地图中.
我的第一张和第二张地图包含具有相同键的条目.所以我想将这些键下的数据合并到我生成的第3张地图中.
所以如果我使用std::merge,我会丢失第一个或第二个地图常用条目中的数据吗?正如我所提到的,两张地图都有共同的数据(值)?
Rev*_*lot 15
如果vectors(或其他顺序容器如listor deque)被排序,那么你可以使用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, 4, 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';
}
Run Code Online (Sandbox Code Playgroud)
输出:1 2 3 4 5 6 7
您可以使用方法向map(或set它们的无序对应物)添加唯一键insert.任何在原始地图已经存在的键不会被替换(在multiset和multimap重复键将被添加,使用set_union,如果这应该避免讨论过).
映射示例(忽略具有重复键的条目):
#include <map>
#include <iostream>
int main()
{
std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}};
std::map<int, int> v2 = { {3, 2}, {4, 2}, {5, 2}, {6, 2}, {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';
}
Run Code Online (Sandbox Code Playgroud)
输出(第一个数字是关键,第二个 - 它来自哪个地图):1:1 2:1 3:1 4:1 5:1 6:2 7:2
如果你切换地图(设置dest1为v2开头和inser值的副本v1),那么输出将是:1:1 2:1 3:2 4:2 5:2 6:2 7:2
多映射的示例(保留两个映射的条目):
#include <map>
#include <iostream>
int main()
{
std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}};
std::map<int, int> v2 = { {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7, 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';
}
Run Code Online (Sandbox Code Playgroud)
输出:1:1 2:1 3:1 3:2 4:1 4:2 5:1 5:2 6:2 7:2
请注意,您不能使用multimap与使用地图完全相同的方式.例如,operator[]是不成功的.您将需要使用insert添加条目,并使用lower_bound或equal_range成员函数来提取条目.
| 归档时间: |
|
| 查看次数: |
3326 次 |
| 最近记录: |