[c++] vector / emplace_back() vs push_back()

Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Ser Cubus »

Hej,
wiem mniej więcej czym różnią się te 2 metody, emplace_back() konstruje obiekt już w wektorze, a push_back() kopiuje lub używa move (co to tak dokładnie znaczy ?). Rozumiem przez to, że emplace_back() powinno być conajmniej tak samo szybkie jak druga metoda, więc jest bardziej opłacalna. Mylę się?

A teraz pytanie, dlaczego w tym kodzie emplace_back daje inne wyniki niż druga metoda (druga metoda działa poprawnie, pierwsza źle)?

Kod: Zaznacz cały

//	zbiorTrWsp.emplace_back(TRW.wspW2, TRW.wspW1, TRW.wspW3);
		
TrojkatWsp tmp(TRW.wspW2, TRW.wspW1, TRW.wspW3);
zbiorTrWsp.push_back(tmp);
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Afish »

Ser Cubus pisze:Hej,
wiem mniej więcej czym różnią się te 2 metody, emplace_back() konstruje obiekt już w wektorze, a push_back() kopiuje lub używa move (co to tak dokładnie znaczy ?).
Używa move constructor.

Co znaczy "działa źle"?
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Ser Cubus »

Zniekształca wartości. Jak tworze obiekt tmp, a potem wrzucam go na wektor to wszytko jest idealnie przekopiowane (w późniejszej części programu wyszukuje te obiekty, to stanowi potwierdzenie). Stosując emplace_back() nie znajduje ich, stosując push_back() wszytko działa idealnie. Różnica w kodzie to tylko ta jedna linijka, więc te 2 metody dają różne rezultaty
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Afish »

No to pokaż cały kod.
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Zordon »

Ja bym zrobił tak.

Kod: Zaznacz cały

zbiorTrWsp.push_back(TrojkatWsp(TRW.wspW2, TRW.wspW1, TRW.wspW3));
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Ser Cubus »

Kod: Zaznacz cały

const size_t SIZE = zbiorTrWsp.size();
//	for(TrojkatWsp& TRW : zbiorTrWsp){	
	for( size_t i =0 ; i < SIZE ; ++i){
		TrojkatWsp& TRW = zbiorTrWsp[i];
		if( (END_Z == TRW.wspW1.Z && END_Z == TRW.wspW2.Z && END_Z == TRW.wspW3.Z)      ||    
(START_Z == TRW.wspW1.Z  && START_Z == TRW.wspW2.Z && START_Z == TRW.wspW3.Z))
				continue;

		if( NaScianieBocznej(TRW.wspW1, START_X +1, START_Y +1, END_X -1, END_Y -1) &&			NaScianieBocznej(TRW.wspW2, START_X +1, START_Y +1, END_X -1, END_Y -1) &&			
NaScianieBocznej(TRW.wspW3, START_X +1, START_Y +1, END_X -1, END_Y -1) ){ 
				
				//zbiorTrWsp.emplace_back(TRW.wspW2, TRW.wspW1, TRW.wspW3);	
				TrojkatWsp tmp(TRW.wspW2, TRW.wspW1, TRW.wspW3);
				zbiorTrWsp.push_back(tmp);
				continue;
		}

		NoNrPkt nnp = TRW.wspW1;																																		TRW.wspW1 = TRW.wspW2;
		TRW.wspW2 = nnp;		
	}
sprawdziłem w debuggerze kilka razy jaki wynik daje emplace_back() i był taki sam jak push_back(), być może w którymś tam wykonaniu dopiero jest błąd, ale nie jestem w stanie tego sprawdzić. Wiem tylko, że teraz program działa prawidłowo i tak w sumie może zostać. Raczej ciekawi mnie źródło problemu.

przepraszam za formatowanie kodu, ale na forum wszytko mi się rozjeżdża
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Afish »

Nie pomogę w ustaleniu źródła problemu, dopóki nie pokażesz całego kodu - jeżeli problemem jest złe zarządzanie pamięcią, to bez kompilującego się i błędnie działającego fragmentu kodu nic nie zdziałam. No i potrzebna jest też definicja TrojkatWsp (chodzi tutaj głównie o konstruktory, destruktory i przeciążone operatory).
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Ser Cubus »

Kod: Zaznacz cały

TrojkatWsp::TrojkatWsp(const double X1,const double Y1,const double Z1, const double X2,
        const double Y2,const double Z2, const double X3,const double Y3,const double Z3)
        : wspW1(X1,Y1, Z1), wspW2(X2, Y2, Z2), wspW3(X3,Y3, Z3){
        };
TrojkatWsp::TrojkatWsp(const NoNrPkt &A,const NoNrPkt &B,const NoNrPkt &C) : wspW1(A), wspW2(B), wspW3(C){
        };

TrojkatWsp::TrojkatWsp(const TrojkatWsp& wzor, const double X ,const double Y)
	: wspW1(wzor.wspW1.X + X, wzor.wspW1.Y + Y, wzor.wspW1.Z),
	wspW2(wzor.wspW2.X + X, wzor.wspW2.Y + Y, wzor.wspW2.Z),
	wspW3(wzor.wspW3.X + X, wzor.wspW3.Y + Y, wzor.wspW3.Z)
	{};

TrojkatWsp::~TrojkatWsp(){};
całego programu nie wrzucę tutaj, ponieważ jest zbyt duży
lemoid
Użytkownik
Użytkownik
Posty: 199
Rejestracja: 24 maja 2012, o 23:36
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 5 razy
Pomógł: 30 razy

[c++] vector / emplace_back() vs push_back()

Post autor: lemoid »

... place-back tutaj rozwinięto temat
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Ser Cubus »

zanim zacznę czytać type&&, co to ? Słyszałem kiedyś o referencji do obiektu tymczasowego, ale to chyba nowość z 0x11. W kążdym bądź razie chciałbym prosić o wytłumaczenie co przjmuje ta instrukcja: void push_back(Type&& _Val);
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[c++] vector / emplace_back() vs push_back()

Post autor: Afish »

... c++11.html
ODPOWIEDZ