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
相关产品推荐
相关产品推荐

