c++ map下标的执行流程是什么?

发布于 2022-09-02 00:57:39 字数 696 浏览 9 评论 0

class A
{
public:
    A()
    {
        cout << "调用默认构造函数" << endl;
    }
    A(A& src)
    {
        cout << "调用拷贝构造函数"  << endl;
    }
    ~A()
    {
        cout << "调用析构函数"  << endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    map<int,A> mapTest;
    cout << "=========" << endl;
    mapTest[0];
    cout << "=========" << endl;
    return 0;
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

与之呼应 2022-09-09 00:57:39

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

皇甫轩 2022-09-09 00:57:39

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

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

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

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

感谢胡须老头和araraloren的回答

空袭的梦i 2022-09-09 00:57:39

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文