【问题标题】: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});

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


【解决方案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 更好或更高效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多