You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++14中unordered_map<long long,vector<pair<int,int>>>的添加与访问咨询

操作unordered_map<long long, vector<pair<int,int>>>的完整指南

嘿,这个需求很常见,我来一步步给你讲清楚怎么添加、访问和遍历这个容器,附上具体的代码示例,你直接改改就能用~

1. 向容器中添加数据

有几种实用的方式,根据你的场景选:

方式一:用[]运算符直接追加元素

unordered_map的[]运算符很贴心——如果键不存在,会自动为它创建一个空的vector,然后你直接用emplace_back或push_back往里面加pair就行。emplace_back可以直接构造pair,比push_back(make_pair(...))更高效,优先用它:

#include <unordered_map>
#include <vector>
#include <utility>
#include <iostream>

int main() {
    std::unordered_map<long long, std::vector<std::pair<int, int>>> mp;

    // 给键5添加三个pair
    mp[5].emplace_back(1, 3);
    mp[5].push_back(std::make_pair(2, 5));
    mp[5].emplace_back(5, 4);

    // 给键89998添加三个pair
    mp[89998].emplace_back(6, 899);
    mp[89998].emplace_back(8, 8887);
    mp[89998].emplace_back(9999, 566);

    // 后续操作示例
    // ...
}

方式二:批量添加现成的vector

如果你已经有一个装满pair的vector,可以直接赋值或者插入:

// 先准备好一个vector
std::vector<std::pair<int, int>> pre_vec = {{10,20}, {30,40}};

// 方式1:赋值——如果键100不存在就创建,存在就覆盖原有vector
mp[100] = pre_vec;

// 方式2:插入——只有键200不存在时才插入,存在就跳过
mp.insert({200, pre_vec});

方式三:用emplace直接构造键值对

这种方式可以避免不必要的拷贝,效率更高,适合一次性添加带多个pair的vector:

mp.emplace(300, std::vector<std::pair<int,int>>{{50,60}, {70,80}});

2. 访问容器中的数据

方式一:用[]快速访问(注意:键不存在会自动创建空vector)

如果确定键一定存在,直接用[]取对应的vector就行:

// 获取键5对应的vector,用引用避免拷贝
std::vector<std::pair<int,int>>& vec5 = mp[5];

// 遍历这个vector里的所有pair
for (auto& p : vec5) {
    std::cout << "(" << p.first << ", " << p.second << ") ";
}
// 输出结果:(1,3) (2,5) (5,4)

方式二:用find安全访问(不会创建空vector)

如果不确定键是否存在,一定要用find,不然会意外创建一个空的vector占内存:

auto it = mp.find(89998);
if (it != mp.end()) {
    // 找到键了,访问对应的vector
    std::vector<std::pair<int,int>>& vec89998 = it->second;
    for (auto& p : vec89998) {
        std::cout << "(" << p.first << ", " << p.second << ") ";
    }
    // 输出结果:(6,899) (8,8887) (9999,566)
} else {
    std::cout << "键89998不存在哦~" << std::endl;
}

方式三:直接访问单个pair元素

如果知道vector的索引,可以直接定位到某个pair的first或second:

// 假设键5存在,取第一个pair的first值
int first_val = mp[5][0].first; // 值是1
// 取第三个pair的second值
int second_val = mp[5][2].second; // 值是4

3. 遍历整个容器

如果要遍历所有的键和对应的vector,用范围for循环最方便:

for (auto& entry : mp) {
    long long key = entry.first;
    std::vector<std::pair<int,int>>& vec = entry.second;
    
    std::cout << "键:" << key << " 对应的元素:";
    for (auto& p : vec) {
        std::cout << "(" << p.first << ", " << p.second << ") ";
    }
    std::cout << std::endl;
}

也可以用迭代器遍历(适合需要手动控制迭代的场景):

for (auto it = mp.begin(); it != mp.end(); ++it) {
    long long key = it->first;
    std::vector<std::pair<int,int>>& vec = it->second;
    
    std::cout << "键:" << key << " 对应的元素:";
    for (auto& p : vec) {
        std::cout << "(" << p.first << ", " << p.second << ") ";
    }
    std::cout << std::endl;
}

内容的提问来源于stack exchange,提问作者Praveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:22:33