Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
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.
#include<iostream>#include<unordered_map>structA{};intmain(){
std::unordered_map<int, A> m;
m.insert(std::make_pair(3,A()));// lub
m.emplace(3,A());return0;}
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)
#include<iostream>#include<unordered_map>structA{};intmain(){
std::unordered_map<int, A> m;
m.insert(std::make_pair(3,A()));// lub
m.emplace(3,A());return0;}
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:
#include<iostream>#include<unordered_map>structA{};intmain(){
std::unordered_map<int, A> m;
m.insert(std::make_pair(3,A()));// lub
m.emplace(3,A());return0;}
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