在没有对象的情况下推回向量中的对象
Posted
技术标签:
【中文标题】在没有对象的情况下推回向量中的对象【英文标题】:Pushing back an object in a vector without the object 【发布时间】:2015-10-11 20:55:02 【问题描述】:我知道在向量中推回一个对象的正确方法是声明一个相同类的对象,并通过值将其作为方法 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;
【问题讨论】:
如果你的班级成员是公开的,那么你可以说myvector.push_back(a, b, c);
。
【参考方案1】:
如果您将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)
然后使用vector::emplace_back
myvector.emplace_back(a, b, c);
【讨论】:
emplace_back()
在 C++11 中添加。对于早期版本,定义构造函数还是有用的,那么你可以这样做:myvector.push_back(MyClass(a, b, c));
【参考方案2】:
要使其工作,您至少需要一个 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
设为公开,但我猜您不想这样做,因为它会更改类的界面。
针对您的问题“为什么emplace_back
比push_back
更好或更高效”:
按照设计,emplace_back()
应避免创建临时对象,并应在向量末尾“就地”构造。使用 push_back(a, b, c)
创建一个临时的 MyClass
对象,然后将其复制到向量的末尾。当然,编译器优化实际上可能导致在两种情况下生成相同的代码,但默认情况下,emplace_back()
应该更有效。此处进一步讨论:push_back vs emplace_back。
【讨论】:
我假设你建议emplace_back
,但你没有这么说。
@NeilKirk 实际上push_back(a, b, c)
也可以(使用构造函数或公共数据)。 (emplace_back
稍微好一点,但那是另一回事了。)
@NeilKirk 使用 emplace_back() 很好,问题,至少我是如何得到它的,本着“这可能与 push_back”的精神,而不是“什么是最有效的方法去做吧”。此外,AlexD 已经涵盖了 emplace_back()。
所提供的答案满足了我的需求。无论如何,为什么emplace_back
比push_back
更好或更高效?以上是关于在没有对象的情况下推回向量中的对象的主要内容,如果未能解决你的问题,请参考以下文章