#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <unordered_map>
#include <unordered_set>
using namespace std;
// 双向链表
struct ListNode {
int times;
unordered_set<string> bucket;
ListNode *prev;
ListNode *next;
ListNode() {
prev = nullptr;
next = nullptr;
}
ListNode(int times, string key) : ListNode() {
this->times = times;
bucket.emplace(key);
}
};
int main() {
unordered_map<string, ListNode *> map;
ListNode *node = new ListNode();
map.emplace("haha", node);
// map["haha"] = node;
ListNode *node2 = new ListNode(1, "x");
map.emplace("haha", node2);
// map["haha"] = node2;
}
- 调试图像:
- 为什么关键字对应的值
"haha"
没有变化呢?应该是0xec1e20
而不是0xec1c90
。 - 当我使用时
operator[]
,我可以成功更改对应的值"haha"
。
std::map::emplace
添加具有给定键的新元素 - 但前提是该键尚不存在:(重点是我的)
在您的情况下,第一次调用
emplace
使用新密钥,因此确实向添加了条目map
。 但是第二次调用emplace
使用已经存在的密钥,因此它什么也不做。另一方面,
std::map::operator[]
始终返回对映射中元素的引用(现有元素,如果不存在则返回新添加的元素)。通过此引用,您可以随时更新该键下的值,就像在第二次调用中一样。