在没有对象的情况下推回向量中的对象

Pushing back an object in a vector without the object

我知道在向量中推回对象的正确方法是声明一个相同 class 的对象并将其作为方法 push_back 的参数按值传递。即类似

class MyClass{
    int a;
    int b;
    int c;
};

int main(){
    std::vector<MyClass> myvector;

    MyClass myobject;
    myobject.a = 1;
    myobject.b = 2;
    myobject.c = 3;

    myvector.push_back(myobject);
    return 0;
}

我的问题是:是否可以推回仅传递该对象的值而不传递另一个对象的对象?即类似

class MyClass{
    int a;
    int b;
    int c;
};

int main(){
    std::vector<MyClass> myvector;

    int a = 1;
    int b = 2;
    int c = 3;

    myvector.push_back({a, b, c});
    return 0;
}

如果您将 abc 声明为 public

class MyClass{
public:
    int a;
    int b;
    int c;
};

那么你可以使用 list initialization:

myvector.push_back({a, b, c});

但是做一个构造函数可能会更好

MyClass::MyClass(int a, int b, int c):
    a(a), b(b), c(c)
{}

然后使用vector::emplace_back

myvector.emplace_back(a, b, c);

要使其工作,您至少需要一个 C++11 编译器,并且需要创建一个构造函数:

class MyClass {
    int a;
    int b;
    int c;
public:
    MyClass(int a_, int b_, int c_) : a(a_), b(b_), c(c_) {}
};

您也可以制作 abc public,但我猜您不想这样做,因为它会改变class.

界面

回答你的问题"why is emplace_back better or more efficient than push_back":

根据设计,emplace_back() 应避免创建临时对象并应在向量末尾构造 "in place"。使用 push_back({a, b, c}) 创建一个临时的 MyClass 对象,然后将其复制到向量的末尾。当然,编译器优化实际上可能会导致在两种情况下生成相同的代码,但默认情况下,emplace_back() 应该更有效。这在此处进一步讨论:push_back vs emplace_back .