c ++ 11运算符[]等价于地图插入上的emplace吗?

对于C ++ 11,以下内容仍然存在性能差异?

(以std::map<Foo, std::vector<Bar> >为例)

map[key] = myVector and map.emplace(key, myVector)

我没有搞清楚的部分是operator []的确切内部。 我的理解到目前为止(当钥匙不存在时):

  • 在地图内部创建一个新的键和相关联的空默认矢量
  • 返回关联的空向量的引用
  • 将myVector分配给参考?
  • 第3点是我无法理解的部分,你怎样才能为参考指定一个新的值?

    虽然我无法通过第3点进行分类,但我认为只需要复制/移动即可。 假设C ++ 11将足够聪明以知道它将是一个移动操作,那么这整个“[]”赋值是否已经比insert()更便宜? 它几乎等同于emplace()? ----默认构建并移动内容,而不是构建带有内容的矢量?


    两者之间有很多不同之处。

    如果使用operator[] ,那么map将默认构造该值。 operator[]的返回值就是这个默认的构造对象,然后使用operator=赋值给它。

    如果您使用emplacemap将直接使用您提供的参数构造该值。

    所以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?

    下一篇: lock<std::mutex> or std::lock