STL地图插入效率:[]与插入

Der*_*Ool 16 c++ stl insert map std-pair

地图插入有两种方式:

m[key] = val;
Run Code Online (Sandbox Code Playgroud)

要么

m.insert(make_pair(key, val));
Run Code Online (Sandbox Code Playgroud)

我的问题是,哪个操作更快?人们通常说第一个较慢,因为如果'key'在map中不存在,STL Standard首先'插入'一个默认元素,然后将'val'分配给默认元素.

但由于'make_pair',我没有看到第二种方式更好.make_pair实际上是一种方便的方式来制作'对' pair<T1, T2>(key, val).无论如何,他们都做了两个任务,一个是将'key'分配给'pair.first',两个分配'val'给'pair.second'.完成配对后,map将插入由'pair.second'初始化的元素.

所以第一种方式是1.' default construct of typeof(val)'2.分配第二种方式是1.赋值2.' copy construct of typeof(val)'

Xeo*_*Xeo 19

两者都有不同的结论.

m[key] = val;
Run Code Online (Sandbox Code Playgroud)

如果key已经存在,则将插入新的键值对,否则它将覆盖映射到key它的旧值(如果它已经存在).

m.insert(make_pair(key, val));
Run Code Online (Sandbox Code Playgroud)

只会在key尚不存在的情况下插入该对,它将永远不会覆盖旧值.因此,相应地选择您想要完成的任务.
对于更有效的问题:个人资料.:P可能是我说的第一种方式.赋值(又名副本)是两种方式的情况,所以唯一的区别在于构造.众所周知并且应该实现,默认构造基本上应该是无操作,因此非常有效.副本就是 - 副本.因此,我们得到一个"无操作"和一个副本,然后我们得到两个副本.
编辑:最后,相信您的分析告诉您的内容.我的分析就像@Matthieu在他的评论中提到的那样,但那是我的猜测.:)


然后,我们有C++ 0x,第二种方式的双拷贝将是无效的,因为现在可以简单地移动它们.所以最后,我认为它回到了我的第一点:用正确的方法来完成你想要做的事情.


小智 5

在具有充足内存的轻载系统上,此代码:

#include <map>
#include <iostream>
#include <ctime>
#include <string>

using namespace std;

typedef map <unsigned int,string> MapType;
const unsigned int NINSERTS = 1000000;

int main() {
    MapType m1;
    string s = "foobar";
    clock_t t = clock();
    for ( unsigned int i = 0; i < NINSERTS; i++ ) {
        m1[i] = s;
    }
    cout << clock() - t << endl;
    MapType m2;
    t = clock();
    for ( unsigned int i = 0; i < NINSERTS; i++ ) {
        m2.insert( make_pair( i, s ) );
    }
    cout << clock() - t << endl;
}
Run Code Online (Sandbox Code Playgroud)

生产:

1547
1453
Run Code Online (Sandbox Code Playgroud)

或重复运行时的类似值.因此插入(在这种情况下)略快.