unordered_map insert

unordered_map insert
AB
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:26
0

Mam bardzo głupi i zapewne banalny problem z dodaniem czegoś do unordered_map.
Kompilator piszczy mi niezrozumiałymi błedami, nie mogę znaleźć zadnego przykładu jak to zrobić wiec zwracam się do was.

Kopiuj
#include <unordered_map>
    std::unordered_map<std::string, sf::Texture> textures;
    std::string path = "test";
    sf::Texture test;
    textures.insert(path, test); // nie dziala.
}
edytowany 1x, ostatnio: abbq
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
5
Kopiuj
textures.insert(make_pair(path, test));
//albo
textures[path] = test; 
gośćabc
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
2
Kopiuj
#include <iostream>
#include <unordered_map>

struct A
{

};

int main()
{
	std::unordered_map<int, A> m;
	m.insert(std::make_pair(3, A()));
	// lub
	m.emplace(3, A());

	return 0;
}
spartanPAGE
  • Rejestracja:około 12 lat
  • Ostatnio:6 dni
2
Kopiuj
#include <unordered_map>
int main() {
	std::unordered_map<int, int> pff;
	pff.insert({0xDEAD, 0xBEEF});
	return 0;
}
edytowany 2x, ostatnio: spartanPAGE
spartanPAGE
Ale w inny sposób! :P Ten mi osobiście bardziej podchodzi, lubię tę konstrukcję
gośćabc
ostatnio mój mentor mi tłumaczył, że trzeba pisać kod czytaelny dla innego programisty (głównie), i zrezygnowałem sam z pisania "brainfuck" kodu (używam tam gdzie raczej koder nie zajrzy)
gośćabc
w tym przypadku emplace jest najseksowniejsze imo
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
1
gośćabc napisał(a):
Kopiuj
#include <iostream>
#include <unordered_map>

struct A
{

};

int main()
{
	std::unordered_map<int, A> m;
	m.insert(std::make_pair(3, A()));
	// lub
	m.emplace(3, A());

	return 0;
}

Nie, nie, nie! Po stokroć nie! Nigdy Nie używaj emplacement w CWUK (containers with unique keys) o ile przewidujesz, że będziesz miał dużo duplikatów. Dla CWUK emplacement powoduje za każdym razem dynamiczną alokację pamięci na nowy node, stworzenie klucza w node (konstruktor) + jeśli node z takim kluczem już istnieje to jeszcze trzeba doliczyć delete zaalokowanej pamięci (destruktor).
Z kolei insert porównuje klucze i jeśli w mapie nie ma takiego klucza to tworzony jest nowy node. W przeciwnym przypadku nic się nie dzieje. Zatem w przypadku duplikacji klucza nie alokacji&dealokacji.
W związku z tym najoptymalniej w przypadku CWUK używać tylko insert i to w takiej formie foo[key] = bar;.

Dla niedowiarków:

  • Scott Meyer, Effective Modern C++ - Item 42: Consider emplacement instead of insertion.
  • Fragment wykładu Scotta Meyers w tym samym temacie:
edytowany 2x, ostatnio: satirev
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
1

Nie, nie, nie! Po stokroć nie! Nigdy nie używaj emplacement w CWUK (containers with unique keys).

Zapomniałeś tam dodać "o ile przewidujesz, że będziesz miał dużo duplikatów". "Nigdy" to baaaaardzo duże nadużycie.

satirev
Zgadza się, thx!
gośćabc
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
0
satirev napisał(a):
gośćabc napisał(a):
Kopiuj
#include <iostream>
#include <unordered_map>

struct A
{

};

int main()
{
	std::unordered_map<int, A> m;
	m.insert(std::make_pair(3, A()));
	// lub
	m.emplace(3, A());

	return 0;
}

Nie, nie, nie! Po stokroć nie! Nigdy Nie używaj emplacement w CWUK (containers with unique keys) o ile przewidujesz, że będziesz miał dużo duplikatów. Dla CWUK emplacement powoduje za każdym razem dynamiczną alokację pamięci na nowy node, stworzenie klucza w node (konstruktor) + jeśli node z takim kluczem już istnieje to jeszcze trzeba doliczyć delete zaalokowanej pamięci (destruktor).
Z kolei insert porównuje klucze i jeśli w mapie nie ma takiego klucza to tworzony jest nowy node. W przeciwnym przypadku nic się nie dzieje. Zatem w przypadku duplikacji klucza nie alokacji&dealokacji.
W związku z tym najoptymalniej w przypadku CWUK używać tylko insert i to w takiej formie foo[key] = bar;.

Dla niedowiarków:

  • Scott Meyer, Effective Modern C++ - Item 42: Consider emplacement instead of insertion.
  • Fragment wykładu Scotta Meyers w tym samym temacie:

no wiesz, ja zazwyczaj jak chcę mieć duplikaty to wybieram jakiś inny kontener,

naturalnie, o ile przewidujesz, że będziesz chciał nadpisywac keye ("o ile przewidujesz, że będziesz miał dużo duplikatów")

to masz rację, ale bez takich panicznych "nie, nie, nie", bo tutaj raczej takiej potrzeby nie ma

edit:
@Satirev :)

edytowany 1x, ostatnio: gośćabc
Azarien
często raczej ma się pewność że elementu w mapie jeszcze nie ma - np. jak się wypełnia pusty kontener.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.