定义
让我们来看一下标准库里对该函数的定义.
map::operator[] - C++ Reference (cplusplus.com)
参数是一个key_val类型的值,返回值是对应key 的value值,如果key不存在的话,value会调用其默认构造函数来初始化.
使用
举个例子
int main() {map<string, string> dict{ { "cat","猫" },{"dog","狗"},{"rabbit","兔子"},{"mouse","老鼠"} };cout << dict["bair"] << endl;for (auto e : dict) {cout << e.first << " : " << dict[e.first] << endl;cout << e.first << " : " << e.second << endl;}cout << dict["bair"] << endl;system("pause");return 0;
}
可以看出对于没有进行初始化的bair元素来说,operator[]会创建一个键值对存在map里,对于初始化的元素来说则会返回其key对应的value.
因为我这里的map的value 是srting类型的所以会被初始化为"",即空字符串.
因为operator[]返回值是value类型的引用所以也可以进行修改
int main() {map<string, string> dict{ { "cat","猫" },{"dog","狗"},{"rabbit","兔子"},{"mouse","老鼠"} };dict["cat"] = "哈基米"; //for (auto e : dict) {cout << e.first << " : " << dict[e.first] << endl;}system("pause");return 0;
}
底层实现
cplusplus(第一张图片那个)网站给了一个建议的实现:(*((this->insert(make_pair(k,mapped_type()))).first)).second
看着很吓人,我来解释一些实现原理
std::map::insert重载了很多,这里的意思是传入一个pair<K,V>类型的值,返回一个pair<iterator,bool>
如果对应的k存在,iterator指向k,bool为false;k不存在,插入iterator指向新的k,bool为true.
Class map{
V& operator[](K& k){return (*((this->insert(make_pair(k,mapped_type()))).first)).second;
}// 通过这一串代码即可实现有key寻值/改值的操作
};
感谢观看!!!!