如何在向量中构造一些类?

Mil*_*uli 0 c++ containers vector std

我正在上一门课,我需要有该课的向量。我希望就地构造对象而不是使用复制构造。看来使用复制构造是不可避免的。

#include <iostream>
#include <string>
#include <vector>


class MyData {

public:
    int age;
    std::string name;

    MyData(int age, std::string name) : age(age), name(name)
    {
        std::cout << "MyData::MyData(int, std::string)\n";
    }

    MyData(const MyData& myData) : age(myData.age), name(myData.name)
    {
        std::cout << "MyData::MyData(const MyData&)\n";
    }

    MyData(MyData&& myData)
        :age(std::move(myData.age)), name(std::move(myData.name))
    {
        std::cout << "MyData::MyData(MyData&&)\n";
    }

    ~MyData() {
        std::cout << "MyData::~MyData()\n";
    }

};

#define DEBUG(...) std::cout << "Exec: " #__VA_ARGS__ << ";\n"; __VA_ARGS__ 

int main()
{

    DEBUG(std::vector<MyData> sb1);
    DEBUG(sb1.emplace_back(MyData{ 32, "SJ" }));
    DEBUG(sb1.emplace_back(MyData{ 42, "SJ" }));
}

Run Code Online (Sandbox Code Playgroud)

代码的输出如下:

Exec: std::vector<MyData> sb1;
Exec: sb1.emplace_back(MyData{ 32, "SJ" });
MyData::MyData(int, std::string)
MyData::MyData(MyData&&)
MyData::~MyData()
Exec: sb1.emplace_back(MyData{ 42, "SJ" });
MyData::MyData(int, std::string)
MyData::MyData(MyData&&)
MyData::MyData(const MyData&)
MyData::~MyData()
MyData::~MyData()
MyData::~MyData()
MyData::~MyData()

C:\Users\XOXOX\source\repos\cpp_stack\x64\Debug\cpp_stack.exe (process 12832) exited with code 0.
Press any key to close this window . . .
Run Code Online (Sandbox Code Playgroud)

我正在使用 C++ 2020 和 MSVC。

Gos*_*low 6

首先当你写的时候

DEBUG(sb1.emplace_back(MyData{ 32, "SJ" }));
Run Code Online (Sandbox Code Playgroud)

您创建一个传递给emplaced_back函数的临时对象。的要点emplace_back是它就地调用构造函数。因此,您必须为其提供创建对象的参数,而不是临时对象,否则它将必须使用复制/移动构造函数。

第二个sb1是容量为 0 的向量。因此,向其中添加项目将必须调整大小,这意味着复制,因为移动构造函数不是noexceptstd::vector无法在调整大小期间处理异常,因此不能冒险使用移动构造函数。

您应该保留右侧以避免调整大小。