Sunrisepeak / opensource-community

Opensource Community
4 stars 0 forks source link

C++ stl中vector的push_back和emplace back #16

Closed CS-liujf closed 2 hours ago

CS-liujf commented 3 hours ago

Background | 背景

当vector中的数据类型是自定义类时,会存在几次构造函数的调用

Describe | 问题描述

#include <iostream>
#include <vector>

class Widget {
public:
    Widget() { std::cout << "Widget constructed\n"; }
    Widget(const Widget&) { std::cout << "Widget copied\n"; }
    Widget(Widget&&) { std::cout << "Widget moved\n"; }
};

int main() {
    std::vector<Widget> vec;

    auto w = Widget();
    vec.push_back(w);
    std::cout<<'\n';

    vec.push_back(Widget()); 
    std::cout<<'\n';

    vec.emplace_back(); 

    return 0;
}

运行上述代码,我的结果是

Widget constructed
Widget copied

Widget constructed
Widget moved
Widget copied

Widget constructed
Widget copied
Widget copied

Desktop | 环境

gcc (Debian 12.2.0-14) 12.2.0

To Reproduce | 复现步骤

直接运行

Expection | 预期结果

第二种触发了移动构造为什么还有拷贝构造,第三种为什么有两个拷贝构造

Solution by you | 已尝试的方案

Additional context | 额外补充

1708737115 commented 2 hours ago

你插入新的元素后vector要扩容然后将原有的元素移动到新的位置,这一部分操作造成的copy,可以考虑再插入两个元素,如果copy调用次数增加,应该就是这样的

CS-liujf commented 2 hours ago

数增加,应该就

谢谢,我刚才试了试使用reserve函数先把位置预留出来,就和我的预期一样了