在没有对象的情况下推回向量中的对象
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;
}
如果您将 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);
要使其工作,您至少需要一个 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
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 .
我知道在向量中推回对象的正确方法是声明一个相同 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;
}
如果您将 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);
要使其工作,您至少需要一个 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
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 .