2014-07-03 14 views
5

Mam std::vector<std::vector<double>> i chciałbym dodać kilka elementów na koniec tego, więc to był mój próbny:umieszczanie wektora z listy inicjatora

std::vector<std::vector<double> > vec; 
vec.emplace_back({0,0}); 

ale to nie kompiluje natomiast dodaje zrobi:

std::vector<double> vector({0,0}); 

Dlaczego element emplace_back nie może skonstruować elementu na tej pozycji? Albo co robię źle?

Dzięki za pomoc.

Odpowiedz

7

Odliczanie szablonów nie może odgadnąć, że lista inicjująca dołączona w nawiasach klamrowych powinna być wektorem. Musisz być wyraźne:

vec.emplace_back(std::vector<double>{0.,0.}); 
+0

dzięki, ale mam jeszcze jedno pytanie do tego: Dlaczego to działa na drugim przykładzie? Ponieważ kompilator ma podobne informacje o typie (emplace_back spodziewa się uzyskać argumenty dla konstruktora std :: vector i tak jest w drugim przykładzie) – m47h

+0

Ponieważ w drugim przykładzie wywołujesz konstruktora wektora, który może obsłużyć listę inicjalizatora bezpośrednio. – marli

+3

Skutecznie nie zajmujesz miejsca, ale po prostu naciskasz już skonstruowany element, zamiast budować wektor w miejscu. –

6

poprzedniej odpowiedzi wspomniano można dostać kod do kompilowania kiedy skonstruowania wektora w kolejce i emplace że. Oznacza to jednak, że wywołujesz konstruktor ruchu na tymczasowym wektorze, co oznacza, że ​​nie tworzysz wektora w miejscu, a to jest cały powód używania emplace_back zamiast push_back.

Zamiast oddasz listę initializer do initializer_list, tak:

#include <vector> 
#include <initializer_list> 

int main() 
{ 
    std::vector<std::vector<int>> vec; 
    vec.emplace_back((std::initializer_list<int>){1,2}); 
} 
+0

To faktycznie wywoła konstruktor ruchu, a nie konstruktor kopiowania. – Arcinde

+0

Dobry połów. Zmieniono moją odpowiedź. –

+0

Dlaczego używasz starego stylu C-cast składni '(std :: initializer_list ) {1,2}' tutaj zamiast konstruktora składni 'std :: initializer_list ({1,2})'? – Peter

Powiązane problemy