unordered_map 用 [] 访问不存在的元素

用 [] 操作符访问 unordered_map 中不存在的 key,并且用临时变量保存会发生什么呢?

unordered_map<string, string> up;
auto result = up[<'any key which is not present'>];

拿上面的代码举例,引用 unordered_map 中不存在的 key,unordered_map 首先会插入一个值被初始化过的 string 类型的对象,然后返回对该对象的引用,所以 result 会得到一个值被初始化过的 string 类型的对象。

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main(){
    unordered_map<string, string> up = {{ "192.168.11.92", "1-1" }};
    string str = "192.168.11.94";
    auto iter1 = up.begin();
    while (iter1 != up.end()) {
        cout << "iteartor 1: " << iter1->first << ", "<< iter1->second << endl;
        iter1++;
    }
    auto result = up[str];	// 索引 unordered_map 中不存在的 key
  	up["192.168.11.93"] = "1-3";
    auto iter2 = up.begin();
    while (iter2 != up.end()) {
        cout << "iteartor 2: " << iter2->first << ", "<< iter2->second << endl;
        iter2++;
    }

    return 0;
}

程序的输出结果

iteartor 1: 192.168.11.92, 1-1
iteartor 2: 192.168.11.93, 1-3
iteartor 2: 192.168.11.92, 1-1
iteartor 2: 192.168.11.94, 

由此可见,引用 unordered_map 中不存在的 key,unordered_map 中会插入这个 key,并为其生成一个 value。
而如果使用 find 函数就不会存在这样的问题:

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main(){
    unordered_map<string, string> up = {{ "192.168.11.92", "1-1" }};
    string str = "192.168.11.94";
    auto iter1 = up.begin();
    while (iter1 != up.end()) {
        cout << "iteartor 1: " << iter1->first << ", "<< iter1->second << endl;
        iter1++;
    }
    auto iter = up.find(str);	// 查找 unordered_map 中不存在的 key
	if (iter == up.end()) cout << str << " doesn’t exist!" << endl;
  	up["192.168.11.93"] = "1-3";
    auto iter2 = up.begin();
    while (iter2 != up.end()) {
        cout << "iteartor 2: " << iter2->first << ", "<< iter2->second << endl;
        iter2++;
    }

    return 0;
}

使用 find 函数查找 unordered_map 中不存在的元素,不会向容器中引入元素,可以避免造成错误。

iteartor 1: 192.168.11.92, 1-1
192.168.11.94 doesn’t exist!
iteartor 2: 192.168.11.93, 1-3
iteartor 2: 192.168.11.92, 1-1

参考资料
[1] stackoverflow-questions-62495482

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++,`unordered_map`是一种关联容器,它存储键值对,并使用哈希表来快速查找元素。当调试`unordered_map`时,可能会遇到看不到元素的问题,原因可能如下: 1. **迭代器无效**:确保你使用的迭代器有效。在使用`unordered_map`的迭代器时,要确保容器不为空,并且在迭代过程没有进行元素的添加或删除操作。 2. **键不存在**:如果你试图访问的键在`unordered_map`不存在,你将无法看到该元素。确保你正在查找的键确实存在于`unordered_map`。 3. **断点设置不当**:如果你在调试过程设置了断点,但没有正确地设置断点,可能会导致你无法看到预期的元素。确保你的断点设置正确,并且你正在查看的代码行确实包含断点。 4. **线程安全问题**:如果你的程序是多线程环境,并且多个线程同时访问和修改`unordered_map`,可能会导致数据不一致或迭代器失效。确保你的代码是线程安全的,或者在使用`unordered_map`时进行适当的同步操作。 5. **日志输出**:如果你想查看`unordered_map`的内容,可以考虑使用日志输出或其他调试工具来跟踪其状态。 为了更好地调试`unordered_map`,你可以尝试以下方法: * 使用调试器(如GDB)来检查迭代器和键值对的状态。 * 使用断点来暂停程序的执行,并查看此时`unordered_map`的内容。 * 使用日志输出或其他调试工具来跟踪`unordered_map`的更改。 * 确保你的代码是线程安全的,或在多线程环境使用适当的同步机制。 希望这些信息对你有所帮助!如果你有更多关于`unordered_map`调试的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值