【发布时间】:2019-10-26 12:30:16
【问题描述】:
在没有找到key的情况下,通过find返回的pass-the-end迭代器进行插入是否定义且有效:
auto it = m.find(key);
if (it == m.end()) {
m.insert(it, make_pair(key, value));
}
因为与使用相比,这将节省额外的查找:
m[key] = value;
【问题讨论】:
-
保存查找的原因是什么?
m[key]将返回对现有元素或它刚刚创建的值初始化元素的引用。 -
传递给
insert的迭代器只是一个提示。实现可以随意忽略它。如果使用了提示并且提示错误,则将执行常规插入。也许你应该看看try_emplace? -
查看实现,libc++ 和 MSVCRT 都完全忽略了对
insert的迭代器提示。 -
好的,那我可以用
it->first = key; it->second = value吗? -
@fluter,不,你不能假装一个过去的迭代器指向一个实际的对象。
标签: c++ c++11 iterator unordered-map