C++ vector push_back() and emplace_back()

C++ vector push_back() and emplace_back()

都是在vector容器尾部添加一个元素。

区别:

push_back():创建元素,将元素拷贝或移动到容器中。

emplace_back():直接在容器尾部创建元素,省区了拷贝或移动的过程。

代码

# include
# include
using namespace std;

class Person {
public:
    int num;

public:
    /*构造函数*/
    Person(int num) {
        cout << "调用构造函数*********" << endl;
        this->num = num;
    }
    /*复制构造函数*/
    Person(const Person& p) {
        cout << "调用复制构造函数**********" << endl;
        this->num = p.num;
        cout << "num = " << this->num << endl;
    }
    /*移动复制构造函数*/
    Person(Person&& p) noexcept {
        cout << "调用移动复制构造函数**********" << endl;
        this->num = p.num;
        p.num = 0;
        cout << "num = " << this->num << endl;
    }
    /*析构函数*/
    ~Person() {
        cout << "调用析构函数**********" << endl;
    }
};

int main() {
    vector<Person> v;

    Person boy(100);//调用构造函数*********
    cout << "--------------------------------------------" << endl;
    cout << "push_back()**********" << endl;
    // 调用构造函数*********
    // 调用移动复制构造函数**********
    // num = 10
    // 调用析构函数**********
    v.push_back(10);//构造函数 + 移动复制构造函数 + 析构函数
    cout << "v.size() = " << v.size() << endl;//v.size() = 1
    cout << "--------------------------------------------" << endl;
    // 调用复制构造函数**********
    // num = 100
    // 调用移动复制构造函数**********
    // num = 10 -- 这里是因为原来v中有元素10,这里增加容量了,要把10也一起移过去
    // 调用析构函数 ********** 析构那个移动复制构造函数的
    v.push_back(boy);//复制构造函数
    cout << "v.size() = " << v.size() << endl;//v.size() = 2
    cout << "--------------------------------------------" << endl;
    cout << "emplace_back()**********" << endl;
    //调用构造函数*********
    //调用移动复制构造函数**********
    //num = 10
    //调用移动复制构造函数 **********
    //num = 100
    //调用析构函数 ********** 析构那个移动复制构造函数的
    //调用析构函数 ********** 析构那个移动复制构造函数的
    v.emplace_back(20);//构造函数
    cout << "v.size() = " << v.size() << endl;//v.size() = 3
    cout << "-------------------------------------------" << endl;
    //调用复制构造函数**********
    //num = 100
    //调用移动复制构造函数 **********
    //num = 10
    //调用移动复制构造函数 **********
    //num = 100
    //调用移动复制构造函数 **********
    //num = 20
    //调用析构函数 ********** 析构那个移动复制构造函数的
    //调用析构函数 ********** 析构那个移动复制构造函数的
    //调用析构函数 ********** 析构那个移动复制构造函数的
    //v.size() = 4
    v.emplace_back(boy);//复制构造函数
    cout << "v.size() = " << v.size() << endl;
    return 0;
}

push_back() 在底层实现时,会优先选择调用移动构造函数,如果没有才会调用拷贝构造函数。

# include
# include
using namespace std;

class Person {
public:
    int num;

public:
    /*构造函数*/
    Person(int num) {
        cout << "调用构造函数*********" << endl;
        this->num = num;
    }
    /*复制构造函数*/
    Person(const Person& p) {
        cout << "调用复制构造函数**********" << endl;
        this->num = p.num;
        cout << "num = " << this->num << endl;
    }
    /*析构函数*/
    ~Person() {
        cout << "调用析构函数**********" << endl;
    }
};

int main() {
    vector<Person> v;

    Person boy(100);//调用构造函数*********
    cout << "--------------------------------------------" << endl;
    cout << "push_back()**********" << endl;
    // 调用构造函数*********
    // 调用复制构造函数***********
    // num = 10
    // 调用析构函数**********
    v.push_back(10);//构造函数 + 移动复制构造函数 + 析构函数
    
    return 0;
}

你可能感兴趣的:(C++八股,c++,开发语言)