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

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】:

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

【讨论】:

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_) 
;

您也可以将 abc 设为公开,但我猜您不想这样做,因为它会更改类的界面。

针对您的问题“为什么emplace_backpush_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_backpush_back 更好或更高效?

以上是关于在没有对象的情况下推回向量中的对象的主要内容,如果未能解决你的问题,请参考以下文章

在没有指针的情况下修改容器中的对象:向量与集合

为啥我的代码没有将每个对象都添加到向量中?

为啥最后一个推回对象的字段到向量中会转移到向量的其他对象? [关闭]

将指针向量元素推回非指针向量c ++时出错

将对象推回向量指针,对象类进入命名空间

如何在没有“排序”的情况下对对象向量进行排序