2015-10-11 3 views
2

Я знаю, что правильный способ отталкивания объекта в векторе - объявить объект того же класса и передать его по значению в качестве аргумента метода 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; 
} 
+1

Если участники вашего класса были общедоступными, вы могли бы сказать 'myvector.push_back ({a, b, c});'. – juanchopanza

ответ

11

Если вы объявляете 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); 
+1

'emplace_back()' был добавлен в C++ 11. Для более ранних версий определение конструктора по-прежнему полезно, вы можете сделать это: 'myvector.push_back (MyClass (a, b, c));' –

0

Чтобы сделать его работу вы должны по крайней мере, 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.

+1

Я предполагаю, что вы предлагаете для 'emplace_back', но вы не так сказать. –

+0

@NeilKirk Фактически 'push_back ({a, b, c})' будет работать также (с конструктором или с общедоступными данными). ('emplace_back' немного лучше, но это уже другая история.) – AlexD

+0

@NeilKirk Использование emplace_back() в порядке, вопрос, по крайней мере, как я его понял, был в духе« это возможно с push_back », тем более чем «что является самым эффективным способом сделать это». Кроме того, AlexD уже рассмотрел emplace_back(). –

Смежные вопросы