用 [] 操作符访问 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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐