Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将向量中的对象推回而不包含该对象_C++_Class_Object_Vector_Push Back - Fatal编程技术网

C++ 将向量中的对象推回而不包含该对象

C++ 将向量中的对象推回而不包含该对象,c++,class,object,vector,push-back,C++,Class,Object,Vector,Push Back,我知道在向量中推回一个对象的正确方法是声明同一类的对象,并将其作为方法push_back的参数按值传递。i、 例如 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;

我知道在向量中推回一个对象的正确方法是声明同一类的对象,并将其作为方法push_back的参数按值传递。i、 例如

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;
}
class-MyClass{
INTA;
int b;
INTC;
};
int main(){
std::vector myvector;
MyClass myobject;
myobject.a=1;
myobject.b=2;
myobject.c=3;
myvector.push_back(myobject);
返回0;
}
我的问题是:有可能推回一个只传递对象值而不传递另一个对象值的对象吗?i、 例如

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;
}
class-MyClass{
INTA;
int b;
INTC;
};
int main(){
std::vector myvector;
INTA=1;
int b=2;
int c=3;
myvector.push_back({a,b,c});
返回0;
}

如果您将
a
b
c
声明为
公共

class MyClass{
public:
    int a;
    int b;
    int c;
};
然后你可以使用:

但最好是构造一个构造函数

MyClass::MyClass(int a, int b, int c):
    a(a), b(b), c(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
公开,但我猜您不想这样做,因为这会更改类的接口

在回答您的问题“为什么
emplace\u back
push\u back
更好或更高效?”


根据设计,
emplace_back()
应避免创建临时对象,并应在向量末尾构建“就地”。使用
push_back({a,b,c})
创建一个临时
MyClass
对象,然后将其复制到向量的末尾。当然,编译器优化实际上可能会导致在这两种情况下生成相同的代码,但默认情况下,
emplace\u back()
应该更有效。这里进一步讨论:.

如果类的成员是公共的,那么可以说
myvector.push_back({a,b,c})
。我假设你建议
放回
,但你没有这样说。@NeilKirk实际上
放回({a,b,c})
也可以(使用构造函数或公共数据)。(
emplace_back
稍微好一点,但那是另一个故事。)@NeilKirk使用emplace_back()很好,这个问题,至少我是如何得到的,是本着“推后是否可能”的精神,而不是“最有效的方法是什么”。此外,AlexD已经介绍了emplace_back()。提供的答案满足了我的需要。无论如何,为什么
emplace\u back
push\u back
更好或更有效?
emplace\u back()
是在C++11中添加的。对于早期版本,定义构造函数仍然很有用,然后您可以这样做:
myvector.push_back(MyClass(a,b,c))