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

symetryczny operator << >> unordered_map

Object Storage Arubacloud
0 głosów
275 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez niezalogowany
Ostatnio chodzi mi po głowie pytanie jak przeciążyć operator>> i operator<< tak aby były symetryczne, kolejność wprowadzania == kolejności wyjścia.

np kontener unordered_map <string,int>

lub unordered_map <string,pair<int,string>>

Bez tworzenia własnej klasy i tam ustawiania klucza

2 odpowiedzi

0 głosów
odpowiedź 24 listopada 2019 przez mokrowski Mędrzec (155,460 p.)
wybrane 24 listopada 2019
 
Najlepsza
Z samej definicji std::unordered_map<...>, nie przechowuje elementów w kolejności. Jak więc chcesz mieć operator który zachowa sekwencję jeśli postawiłeś sobie nierealne ograniczenie "nic nie implementować w dodatkowej klasie"? Operator (żaden) nie ma takich zdolności. Ma je jakiś kontener.

Proste ale nie idealne rozwiązanie: Możesz przechować w kontenerze sekwencyjnym hash z klucza właśnie wstawianego lub sam klucz (to zależy od wymagań) a w unordered_map dany element. Wtedy możesz implementować operatory które będą działały jak wymagasz.
komentarz 24 listopada 2019 przez niezalogowany
Właśnie tej tablicy hash() nie mogę zakumać, jakaś literatura z dużą ilością przykładów?
komentarz 24 listopada 2019 przez mokrowski Mędrzec (155,460 p.)
Myślę że esencjonalne: https://medium.com/@aozturk/simple-hash-map-hash-table-implementation-in-c-931965904250

Do podręczników (I książek) mogę także odesłać jak będę w ich zasięgu (wyjazd). Pamiętam jedynie że sprytna implementacja jest w słownikach Python'a. Wbrew pozorom do implementacji w stdlib, można się cepiać co do wydajności...

Jak chcesz czegoś poważniejszego,... napisz.
komentarz 24 listopada 2019 przez niezalogowany
ok dzięki;
0 głosów
odpowiedź 23 listopada 2019 przez tkz Nałogowiec (42,000 p.)
#include <iostream>
#include <map>
#include <string>
#include <vector>

std::ostream & operator <<(std::ostream &os, 
                           const std::map<std::string, std::vector<int>> &m)
{
    for (const auto &p : m)
    {
        os << p.first << ": ";
        for (int x : p.second) os << x << ' ';
        os << std::endl;
    }

    return os;
}

int main()
{
    std::map<std::string, std::vector<int>> m =
    {
        { "A", { 1, 2, 3, 4, 5 } },
        { "Z", { 5, 4, 3, 2, 1 } }
    };

    std::cout << m << std::endl;
}

Coś takiego?

komentarz 24 listopada 2019 przez niezalogowany
edycja 24 listopada 2019

no nie zupełnie bardziej coś co robi coś takiego tylko symetrycznie, bez find by można było wczytać first. No i wiadomo find to zawsze iteracja.

Jakiś do głowy przychodzi mi tylko jakiś wektor wskaźników lub własna klasa bardziej rozbudowana (raczej bez klasy się nie obędzie bo "chary" i tak będę musiał policzyć).

#include <iostream>
#include <unordered_map>

using namespace std;

int main()
{
    unordered_map<string,int> um;
    um["droga S="];
    um["czas t="];
    um["predkosc V="];
    unordered_map<string,int> ::iterator it;
    //cin>>um.find("droga S");

    it=um.find("droga S=");
    cout<<it->first<<it->second<<endl;
    it=um.find("czas t=");
    cout<<it->first<<it->second<<endl;
    it=um.find("predkosc V=");
    cout<<it->first<<it->second<<endl;



    it=um.find("droga S=");
    cin>>it->second;
    it=um.find("czas t=");
    cin>>it->second;
    it=um.find("predkosc V=");
    cin>>it->second;


    it=um.find("droga S=");
    cout<<it->first<<it->second<<endl;
    it=um.find("czas t=");
    cout<<it->first<<it->second<<endl;
    it=um.find("predkosc V=");
    cout<<it->first<<it->second<<endl;

    return 0;
}

edit:: to zamknięte w klasie nie main()

komentarz 24 listopada 2019 przez tkz Nałogowiec (42,000 p.)
A tak z ciekawości. Po co Ci to?
komentarz 24 listopada 2019 przez niezalogowany
edycja 24 listopada 2019
powiedzmy nie masz programu tylko plik tekstowy. Np notatnik zrobiony np w Qt, jak windowsowy, tylko z przyciskiem oblicz. Zmieniasz dane w pliku i wciskasz oblicz.

To można na rożne sposoby zrobić, ale jak chciałbyś zmienne zapisywać jako stringi to mapa nie jest zła.

Musisz sprawdzić czy nikt nie pozmieniał nazw zmiennych i obliczyć i powstawiać wartości.

edit:: był kiedyś taki program rm-win który posiadał szablony dokumentacji w plikach Word. I ciągle zastanawiam się jak to było zrobione?
komentarz 24 listopada 2019 przez tkz Nałogowiec (42,000 p.)

W jakim było by to formacie zapisane?

V 13
A 12
S 10
// gdzie litery to zmienne fizyczne

Tak?

komentarz 24 listopada 2019 przez niezalogowany
tam to było czyste C i zmienne były zapisane specjalnymi znakami. Ale nie chodzi oto ja nie chcę kopiować tylko zrobić coś innego troszkę podobnego, ale oparte na STL i C++.
komentarz 24 listopada 2019 przez tkz Nałogowiec (42,000 p.)
Będzie trudno pomóc jak nie powiesz jak ma wyglądać ten plik, jakikolwiek zarys. Najlepiej przykład i co ma robić.
komentarz 24 listopada 2019 przez niezalogowany
edycja 24 listopada 2019
Jak skończę to pokażę. Na razie ciągle jestem na etapie planowania i jak utrzymam takie tępo to i tak zostanie :). Coś w głowie pozostanie po tych kombinacjach ale nie wiele.

Ukryję pytanie za jakieś 15min.

Jak ogarnę te tablice, to może wrócę do tego pytania. Na razie funkcja hash to zbyt duży poziom abstrakcji.

Edit :: chciałem ale żarówki nie widzę
komentarz 24 listopada 2019 przez tkz Nałogowiec (42,000 p.)
Nie ma sensu na początku planować, bo nigdy nie zaczniesz pisać. Nie ukrywaj pytania, może ktoś bardziej ogarnięty będzie wiedzial.

Podobne pytania

0 głosów
2 odpowiedzi 358 wizyt
pytanie zadane 3 października 2015 w C i C++ przez broda Początkujący (380 p.)
0 głosów
2 odpowiedzi 549 wizyt
pytanie zadane 22 marca 2020 w C i C++ przez wall7489 Obywatel (1,250 p.)
0 głosów
1 odpowiedź 163 wizyt
pytanie zadane 19 czerwca 2017 w C i C++ przez Rivit Nowicjusz (200 p.)

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...