unordered_map 用 [] 访问不存在的元素
引用 unordered_map 中不存在的 key,unordered_map 首先会插入一个值被初始化过的 string 类型的对象,然后返回对该对象的引用,所以 result 会得到一个值被初始化过的 string 类型的对象。由此可见,引用 unordered_map 中不存在的 key,unordered_map 中会插入这个 key,并为其生成一个 value。使用 find 函数查找
·
用 [] 操作符访问 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
更多推荐
已为社区贡献1条内容
所有评论(0)