我知道在向量中推回对象的正确方法是声明同一个类的对象并将其作为方法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;
}
答案 0 :(得分:11)
如果您将a
,b
,c
声明为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)
{}
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_) {}
};
您还可以公开a
,b
和c
,但我猜您不想这样做,因为它会更改班级的界面。< / p>
回答您的问题“为什么emplace_back
比push_back
更好或更有效率”:
按照设计,emplace_back()
应该避免创建临时对象,并且应该在向量的末尾构建“就地”。使用push_back({a, b, c})
创建一个临时MyClass
对象,然后将其复制到向量的末尾。当然,编译器优化实际上可能导致在两种情况下生成相同的代码,但是,默认情况下,emplace_back()
应该更有效。这将在此处进一步讨论:push_back vs emplace_back。