unordered_map insert

Odpowiedz Nowy wątek
2015-01-29 14:23
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.

#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, 2015-01-29 14:24

Pozostało 580 znaków

2015-01-29 14:42
textures.insert(make_pair(path, test));
//albo
textures[path] = test; 

Pozostało 580 znaków

2015-01-29 15:11
2
#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;
}

Pozostało 580 znaków

2015-01-29 15:13
2
#include <unordered_map>
int main() {
    std::unordered_map<int, int> pff;
    pff.insert({0xDEAD, 0xBEEF});
    return 0;
}
edytowany 2x, ostatnio: spartanPAGE, 2015-01-29 15:13
było, to para :D, chyba to nawet jest poprawne http://melpon.org/wandbox/permlink/8Ila8gDG7EoiBNEj - gośćabc 2015-01-29 15:14
Ale w inny sposób! :P Ten mi osobiście bardziej podchodzi, lubię tę konstrukcję - spartanPAGE 2015-01-29 15:17
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 2015-01-29 15:21
w tym przypadku emplace jest najseksowniejsze imo - gośćabc 2015-01-29 15:23

Pozostało 580 znaków

2015-01-29 21:51
1
gośćabc napisał(a):

#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! <del>Nigdy</del> 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: https://www.youtube.com/watch?v=smqT9Io_bKo#t=2579
edytowany 2x, ostatnio: satirev, 2015-01-29 22:22

Pozostało 580 znaków

2015-01-29 22:18
Rev
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.


Zgadza się, thx! - satirev 2015-01-29 22:20

Pozostało 580 znaków

2015-01-29 23:40
0
satirev napisał(a):
gośćabc napisał(a):

#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! <del>Nigdy</del> 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: https://www.youtube.com/watch?v=smqT9Io_bKo#t=2579

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, 2015-01-29 23:41
często raczej ma się pewność że elementu w mapie jeszcze nie ma - np. jak się wypełnia pusty kontener. - Azarien 2015-01-30 15:41

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0