stl - c++ map下标的执行流程是什么?
PHP中文网
PHP中文网 2017-04-17 13:21:07
0
3
661
class A { public: A() { cout << "调用默认构造函数" << endl; } A(A& src) { cout << "调用拷贝构造函数" << endl; } ~A() { cout << "调用析构函数" << endl; } }; int _tmain(int argc, _TCHAR* argv[]) { map mapTest; cout << "=========" << endl; mapTest[0]; cout << "=========" << endl; return 0; }

执行结果:

疑问:
使用map下标操作如果不存在key的话,会调用默认构造函数生成一个实例,为什么会调用两次拷贝构造函数呢?下标操作的具体执行流程是什么?有什么办法可以跟踪到执行流程?

PHP中文网
PHP中文网

认证0级讲师

全員に返信 (3)
左手右手慢动作

如果key不存在,那么map会帮你生成一个map::value_type aka: pair(by std::make_pair),然后这个临时产生的pair插入到map当中时又会被重新构造一遍,所以会有两次拷贝。不过现在是21世纪了,可以利用Move语义来充分利用临时对象来减少拷贝。
你可以试试用C++11来编一下程序,看看结果有何不同。

いいねを押す+0
    伊谢尔伦

    参考胡须老头的回答,我模拟了一下流程

    map mapTest; cout << "=========" << endl; mapTest[0]; cout << "=========" << endl; cout << "1" << endl; A temp1; cout << "2" << endl; pair pa = std::make_pair(1,temp1); cout << "3" << endl; mapTest.insert(pa); cout << "=========" << endl;

    结果:

    确实是生成了两个临时对象,所以会有两次拷贝、两次析构。
    map下标大概流程:
    如果key不存在的情况下

    1.生成一个临时对象 2.生成一个pair 3.插入到map中

    感谢胡须老头和araraloren的回答

    いいねを押す+0
      小葫芦

      就像 上面的胡须老头说的那样,构造一次,然后拷贝一次产生一个Pair类型,最终拷贝到Map的数据结构中
      执行流程不就是你说的那样,先寻找这个key,不存在创建一个插入进去,具体的流程比较复杂,涉及到的调用很多,如果想知道可以看map的源码,当然VS的map源码不是写给人看的。。。你可以参阅其它stl的map源码
      在C++11里面,这个操作就省劲多了,只用了一次构造就完成了,当然也调用了Move(移动)构造函数。。
      最后就是,一般不要这么用。。

      いいねを押す+0
        最新のダウンロード
        詳細>
        ウェブエフェクト
        公式サイト
        サイト素材
        フロントエンドテンプレート
        私たちについて 免責事項 Sitemap
        PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!