• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

std::map , std::pair, std::function Wyjasnienie i jakie zastosowanie.

VPS Starter Arubacloud
+3 głosów
618 wizyt
pytanie zadane 28 listopada 2018 w C i C++ przez Poczprogramista123 Bywalec (2,900 p.)
Witam bardzo bym prosil o wytlumaczenie co powyzsze klasy robia i jakie jest ich zastosowanie. Opis w internecie nie dokonca jest jasny a nie ma lepszego wyjasnienia od osoby co opisze to swoimi slowami. Z gory dzieki.

1 odpowiedź

+4 głosów
odpowiedź 28 listopada 2018 przez RafalS VIP (122,820 p.)

Mapa to taka tablica, ktora mozna indeksowac dowolnym typem, np stringiem. Pozwala to na napisanie takiego kodu:

	std::unordered_map<string, string> slownik_en_pl;
	slownik_en_pl["cat"] = "kot";
	slownik_en_pl["dog"] = "pies";
	// itd
	cout << "cat to po polsku: " << slownik_en_pl["cat"] << endl;

Zastosowan jest masa:

	std::unordered_map<char, int> wielkosci_dyskow;
	wielkosci_dyskow['C'] = 1000;
	wielkosci_dyskow['D'] = 328724;

	std::unordered_map<string, double> wyniki_wyborow;
	wyniki_wyborow["andrzej duda"] = 32.4212;
	wyniki_wyborow["JKM"] = 4.76

std::pair to zwykla para liczb. Przydaje sie np gdy chcemy przeiterowac po mapie, gdzie kazdy element ma klucz i wartosc:

	for (std::pair<string, double> wynik : wyniki_wyborow) {
		cout << wynik.first << " zdobyl: " << wynik.second << endl;
	}

Przeważnie nie jest jednak używany, bo zawsze łatwiej jest stworzyć klase składającą się z tych dwóch wartosci, której nazwa mowi jasno co te wartosci oznazcaja.

std::function to takie uogólnienie czegoś co mozna wywołać: funkcja, lambda, metoda. Kilka przykladow jest tutaj:

https://en.cppreference.com/w/cpp/utility/functional/function

komentarz 28 listopada 2018 przez Poczprogramista123 Bywalec (2,900 p.)
Super dzieki odrazu sie rozjasnilo. Tylko czym sie rozni std::map od std::unordered_map?
komentarz 28 listopada 2018 przez criss Mędrzec (172,590 p.)
unordered_map ma staly czas dostepu, a map logarytmiczny wzgledem ilosci elementow
komentarz 2 grudnia 2018 przez Poczprogramista123 Bywalec (2,900 p.)

Ok. Dopytam tutaj bo nie rozumiem czm ten zapis dziala. Przyklad z kursu http://cpp0x.pl/dokumentacja/standard-C++11/function/1121. Przeciez jest niezgodnosc argumentow wiec jakim cudem to dziala. 

class CKlasa
{
public:
    CKlasa( int x )
        : m_x( x )
    { }
    void metoda( int a, int b )
    {
        printf( "[metoda] %d, %d\n", m_x * a, m_x * b );
    }
private:
    int m_x;
};

void funkcja( CKlasa * klasa, int a, int b )
{
    printf( "[funkcja] %d, %d\n", a, b );
}

int main()
{
    CKlasa klasa( 2 );
    //Deklaracja delegata:
    std::function < void( CKlasa *, int, int ) > fnAdres;
    
    //Przypisanie funkcji i jej wywołanie:
    fnAdres = & funkcja;
    fnAdres( & klasa, 3, 5 );
    

/// Chodzi o ten fragment
    //Przypisanie metody i jej wywołanie:
    fnAdres = & CKlasa::metoda;
    fnAdres( & klasa, 3, 5 );

I mam jeszcze jedna niepewnosc. Czy wyrazenia lambda to poprostu nowa stworzona funkcja w ciele funkcji. Dobrze rozumiem?

komentarz 2 grudnia 2018 przez Poczprogramista123 Bywalec (2,900 p.)

I jeszcze to xd sory ze tyle pytam ale chce juz miec to ulozone w glowie.

Jaka nest roznica miedzy tymi zapisami

/// 1
std :: function < void ( int ) > f_display = print_num ; 
 f_display ( - 9 ) ;

/// 2
std :: function < void ( int ) > f_display = &print_num ; 
 f_display ( - 9 ) ;

Nie powinno byc tak ze tylko 2 przypadek jest poprawny. Przeciez std::function musi wiedziec gdzie ta funkcja sie znajduje.

komentarz 2 grudnia 2018 przez criss Mędrzec (172,590 p.)

Lambda to mechanizm języka i nie powinieneś tego bezpośrednio przekładać na jakiekolwiek konstrukcje inne językowe. Ale jeśli dobrze kojarze, to lambda jest przez kompilator zamieniana na klase ze zdefiniowanym operatorem (). Elementy capture-list są wtedy zamieniane an membery (pola) takiej klasy. Przy czym capture-by-reference powoduje, że lambda, będzie trzymać adres przechwyconego elementu, a capture-by-value - jego kopie.

Co do tego pierwszego pytania: tak wkleiłeś ten kod, że moge ci tylko pogratulować sprytu  o, poprawiłeś, dzięki :D. W każdym razie nie widze tam żadnej niezgodności argumentów. Sprecyzuj o którą linie ci chodzi.

komentarz 2 grudnia 2018 przez criss Mędrzec (172,590 p.)

Jaka nest roznica miedzy tymi zapisami

Żadnej. `print_num` i `&print_num` to dokładnie to samo - oba dają adres funkcji. 

komentarz 2 grudnia 2018 przez Poczprogramista123 Bywalec (2,900 p.)

@Criss, Wiem wiem zorientowalem sie ale to nie bylo umyslne. Chodzi mi o to ze void Cklas::metoda(int,int) ma tylko dwa argumenty a my przeciez okreslilismy ze std::functional moze przechowywac funkcje z trzema argumentami.

komentarz 2 grudnia 2018 przez criss Mędrzec (172,590 p.)
Ah, nie-statyczne metody (non-static member functions) mają jeden niewidoczny w "normalnym" użytkowaniu parametr. Ten dodatkowy parametr jest zawsze pierwszy i oznacza obiekt na którym metoda jest wywoływana. Tak jak jest to w przypadku CKlasa::metoda - tym ukrytym parametrem jest CKlasa*. Chyba może to być też referencja jeśli tylko tak ci wygodniej, ale nie jestem pewien.
komentarz 2 grudnia 2018 przez criss Mędrzec (172,590 p.)
edycja 2 grudnia 2018 przez criss

PS: odnośnie odpowiedzi RafalS. 

Mapa to taka tablica, ktora mozna indeksowac dowolnym typem, np stringiem.

Generalnie std::map jest oparte na strukturze drzewa (red-black tree z reguły). Rozumiem, że to z tablicą to uproszczenie, ale IMHO zbyt duże i mogło być mylące :)

komentarz 2 grudnia 2018 przez Poczprogramista123 Bywalec (2,900 p.)
O kurde w zyciu bym nie zgadl. Super dzieki wielkie.
komentarz 2 grudnia 2018 przez Poczprogramista123 Bywalec (2,900 p.)
Czyzby wlasnie to okresla nam wskaznik this?
komentarz 2 grudnia 2018 przez criss Mędrzec (172,590 p.)

Czyzby wlasnie to okresla nam wskaznik this?

Dokładnie :) 

komentarz 2 grudnia 2018 przez RafalS VIP (122,820 p.)

Generalnie std::map jest oparte na strukturze drzewa (red-black tree z reguły). Rozumiem, że to z tablicą to uproszczenie, ale IMHO zbyt duże i mogło być mylące :)

Serio to mogłoby być mylące dla kogoś kto w ogóle nie wiedział co to jest mapa :D?

Dla laika mapa to od strony użytkowej dosłownie tablica ktorą indeksujesz dowolnym typem, aczkolwiek mówiąc tablica mam na mysli kolekcje elementów, z której można wyciągać elementy kolekcja[indeks], a nie ciągłośc pamięci, ale byłem w stanie splamić moją programistyczną dusze tym bluźnierskim uproszczeniem, żeby czegoś nowych kolegów nauczyć.

To jak to jest zrobione pod spodem pomaga jedynie zrozumieć czemu jakaś operacja jest szybka a druga wolna, ale ide o zakład, że miliony programstów pythona, którzy nie słyszeli ani pół słowa o drzewach BST korzysta ze słowników bez żadnego problemu :P Ignorancji oczywiście nie pochwalam, ale mówię tylko, że ta wiedza nie jest niezbędna do podstawowego korzystania z tej struktury danych.

Podobne pytania

0 głosów
0 odpowiedzi 472 wizyt
pytanie zadane 30 lipca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
3 odpowiedzi 230 wizyt
pytanie zadane 29 lipca 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
0 głosów
1 odpowiedź 289 wizyt
pytanie zadane 7 czerwca 2019 w C i C++ przez BartekSV123 Nowicjusz (240 p.)

92,959 zapytań

141,920 odpowiedzi

321,152 komentarzy

62,293 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...