C++中的unordered_map

在刷leetcode题目,遇到的第一道题就是给一个整数数组 nums 、整数目标值 target,在数组中找到和为target的两个坐标。

unordered_map为C++中STL哈希表的实现,unordered_map 可以将键值映射到不同桶中,快速查找对应的键。

1、头文件包含unordered_map

2、定义和初始化,key_type表示键类型,mapped_type表示值类型

// 空 unordered_map
std::unordered_map<key_type, mapped_type> map; 
// 大小为 n 的 unordered_map
std::unordered_map<key_type, mapped_type> map(n);  
// 大小为 n,值为 value 的unordered_map
std::unordered_map<key_type, mapped_type> map(n, value);  
// 复制 another_map 的内容初始化
std::unordered_map<key_type, mapped_type> map(other_map);  
// 复制 another_map 的区间初始化
std::unordered_map<key_type, mapped_type> map(other_map.begin(), other_map.end());  

3、插入和访问

// 插入一对键值对
map.insert(std::make_pair(key, value));  
// 插入一对键值对
map.insert({key, value}); 
// 插入或覆盖键对应的值
map[key] = value;

4、删除元素

// 删除键为 key 的元素
map.erase(key);  
// 删除所有元素,将 unordered_map 置为空
map.clear();  

5、迭代器进行遍历

使用map.begin()和map.end()返回unordered_map中的迭代器

for (auto it = map.begin(); it != map.end(); it++) 
{
    // 获取键
    key_type key = it->first;  
    // 获取值
    mapped_type value = it->second;  
    // ...
}

使用 auto 关键字简化迭代器的定义:

for (auto& [key, value] : map) 
{
    // ...
}

6、获取元素个数

// 获取元素个数
std::size_t size = map.size();  
// 测试 key 是否存在于 unordered_map 中
bool exists = map.count(key) > 0;  

思路:

1、创建空的哈希表

2、遍历数组中的每个元素,计算出与目标值 target 的差值 temp。

3、在哈希表中查找是否存在键为 temp 的元素。如果存在,则说明 nums[i] 与之前的某个元素的和等于 target,直接返回它们的下标。

因此,需要使用 unordered_map 数据结构提供的 find 方法,在哈希表 map 中搜索是否存在键为 temp 的元素。如果 find 方法返回的迭代器指向哈希表的尾部,则说明哈希表中不存在键为 temp 的元素,需要将当前元素的值和下标保存到哈希表中。如果存在,则说明数组中存在两个元素的和等于目标值 target,直接返回它们的下标即可。

具体来说,if (map.find(temp) != map.end()) 这一句话,map.find(temp) 返回一个指向哈希表 map 中键为 temp 的元素的迭代器。如果要搜索的元素不存在,则返回指向哈希表尾部的迭代器,即 map.end()。因此,可以通过判断 find 方法的返回值是否等于 map.end() 来判断是否存在键为 temp 的元素,从而决定是否需要将当前元素的值和下标保存到哈希表中。

class Solution 
{
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        std::unordered_map<int, int> map;                       // 创建空的哈希表

        for (int i = 0; i < nums.size(); i++)                   // 遍历整个数组
        {
            int temp = target - nums[i];                        
            if (map.find(temp) != map.end())                    // map.find(temp) 返回一个指向哈希表 map 中键为 temp 的元素的迭代器 
            {
                return { map[temp], i };
            }
            map[nums[i]] = i;                                   // 用于赋值给哈希表
        }
    throw "No two sum solution";                                // 异常处理
    }
};

疑问:对C++还不熟悉,所以有很多的疑问。

1、if (map.find(temp) != map.end()) 是干什么的?

if (map.find(temp) != map.end()) 这一句话,map.find(temp) 返回一个指向哈希表 map 中键为 temp 的元素的迭代器。如果要搜索的元素不存在,则返回指向哈希表尾部的迭代器,即 map.end()。因此,可以通过判断 find 方法的返回值是否等于 map.end() 来判断是否存在键为 temp 的元素,从而决定是否需要将当前元素的值和下标保存到哈希表中。

2、throw “No two sum solution”;这一句话是干什么的?

throw 语句抛出一个异常。throw 语句可以将控制权转移到调用该函数的位置,并且带有一个异常对象,该对象可以是一个基本的数据类型(例如 char、int、double 等),也可以是一个自定义的类型。

3、map.find(temp)是不是也会保存temp?

map.find(temp) 函数的作用是查找哈希表中键等于 temp 的元素,并且返回一个指向该元素的迭代器。

复杂度:不考虑,工作原因没必要。其他的方法:个人偏向于积累和实际,没必要一题多解。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++,unordered_map是一种关联容器,用于存储键值对。可以通过键快速查找值,其元素是无序的。在unordered_map,我们可以使用at和[ ]两种操作来获取元素的值。例如,m和m.at(1)都可以获取键为1的元素的值。 此外,unordered_map还提供了一些容量查询的函数,例如empty()用于查询是否为空,size()用于查询键值对的数量,max_size()用于查询unordered_map所能包含的最大键值对数量。还有count()函数可以查询关键字为key的元素的个数。在unordered_map,返回的结果非0即1。 如果需要删除元素,可以使用erase()函数。erase()函数可以删除迭代器指向的位置的键值对,并返回一个指向下一元素的迭代器。还可以使用erase()函数删除一定范围内的元素,以及根据Key来进行删除。clear()函数可以清空整个unordered_map。 另外,我们可以使用find()函数来进行关键字查询。如果找到了该关键字,find()函数会返回指向该关键字的迭代器;如果未找到,则会返回指向end的迭代器。根据unordered_map的类型不同,返回的迭代器可以是iterator或者const_iterator。<span class="em">1</span> #### 引用[.reference_title] - *1* [C++ unordered_map](https://blog.csdn.net/weixin_43203889/article/details/116029452)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值