c ++ 11运算符[]等价于地图插入上的emplace吗?
对于C ++ 11,以下内容仍然存在性能差异?
(以std::map<Foo, std::vector<Bar> >
为例)
map[key] = myVector and map.emplace(key, myVector)
我没有搞清楚的部分是operator []的确切内部。 我的理解到目前为止(当钥匙不存在时):
第3点是我无法理解的部分,你怎样才能为参考指定一个新的值?
虽然我无法通过第3点进行分类,但我认为只需要复制/移动即可。 假设C ++ 11将足够聪明以知道它将是一个移动操作,那么这整个“[]”赋值是否已经比insert()更便宜? 它几乎等同于emplace()? ----默认构建并移动内容,而不是构建带有内容的矢量?
两者之间有很多不同之处。
如果使用operator[]
,那么map
将默认构造该值。 operator[]
的返回值就是这个默认的构造对象,然后使用operator=
赋值给它。
如果您使用emplace
, map
将直接使用您提供的参数构造该值。
所以operator[]
方法将始终使用两阶段构造。 如果默认构造函数很慢,或者如果复制/移动构造比复制/移动赋值更快,则可能会出现问题。
但是,如果提供的密钥已存在, emplace
不会替换该值。 而operator[]
后跟operator=
将始终替换该值,无论是否存在该值。
还有其他的不同之处。 如果复制/移动投掷, emplace
保证map
不会被改变。 相比之下, operator[]
将始终插入默认的构造元素。 所以如果后面的复制/移动分配失败,那么map
已经被改变了。 该键将与默认构造的value_type
一起存在。
真的,在决定使用哪一个时,性能不是你应该考虑的第一件事。 您需要首先关注它是否具有所需的行为。
C ++ 17将提供insert_or_assign
,它具有map[] = v;
的效果map[] = v;
,但是insert/emplace
安全性除外。
你怎么能在第一个地方给一个参考分配一个新的值?
这是一个从分配给任何非根本没有什么不同const
参考:
int i = 5;
int &j = i;
j = 30;
i == 30; //This is true.
链接地址: http://www.djcxy.com/p/60517.html
上一篇: Is c++11 operator[] equivalent to emplace on map insertion?