在没有对象的向量中推回对象

时间:2015-10-11 20:55:02

标签: c++ class object vector push-back

我知道在向量中推回对象的正确方法是声明同一个类的对象并将其作为方法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;
}

2 个答案:

答案 0 :(得分:11)

如果您将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);

答案 1 :(得分:0)

要使其工作,您至少需要一个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,但我猜您不想这样做,因为它会更改班级的界面。< / p>

回答您的问题“为什么emplace_backpush_back更好或更有效率”:

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