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

Przekazywanie wartości mapy do tablicy

Object Storage Arubacloud
0 głosów
473 wizyt
pytanie zadane 3 sierpnia 2019 w C i C++ przez wik90210 Nowicjusz (120 p.)

Witam ;)

Za pomocą mapy obliczyłam, ile razy dana litera występuje w danym słowie, ale muszę potem wykonać na tej wartości operacje matematyczne, więc chcę je zapisać do tablicy.

Pętla z vectorem zapisuje wartość dla każdej litery po kolei, przez co wartości się powtarzają. Jak przekazać tablicy jedynie wartości mapy? Jest jakaś szybsza opcja oprócz sprawdzania każdego elementu po kolei?

Nie mam zbyt dużego doświadczenia z mapami i to pytanie mnie dręczy od dłuższego czasu. Z góry dziękuję :)
 

int main()
{
        string slowo;
        cin>>slowo;
        map<char, int> mapa;
        map<char, int>::iterator it1;
        vector<int> ile;

    for(int i=0; i<slowo.length(); i++)
   {
      mapa[slowo[i]]++;
   }

      for(it1=mapa.begin(); it1!=mapa.end(); it1++)
        cout<<it1->first<<' '<<it1->second<<endl; 


  for(int i=0; i<slowo.length(); i++)
        {
            ile.push_back(mapa[slowo[i]]);
        }
}

 

4 odpowiedzi

+2 głosów
odpowiedź 3 sierpnia 2019 przez j23 Mędrzec (194,920 p.)
for (auto &i : mapa) {
    ile.push_back(i->second);
}

 

+2 głosów
odpowiedź 3 sierpnia 2019 przez RafalS VIP (122,820 p.)
for(int i=0; i<slowo.length(); i++)
        {
            ile.push_back(mapa[slowo[i]]);
        }

problem w tym,  że iterujesz po literach słowa, które się powtarzają, a nie po elementach mapy tak jak 2 linijki wyżej.

Najprościej zrobić to tak:

    for (auto para : mapa)
    {
        ile.push_back(para.second);
    }

lub

    for (auto it = mapa.begin(); it != mapa.end(); ++it)
    {
        ile.push_back(it->second);
    }

 

map<char, int>::iterator it1;

od takich rzeczy jest słówko kluczowe auto:

for(auto it = mapa.begin();it!=mapa.end();++it)

PS: popracuj nad formatowaniem kodu

komentarz 3 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Mam pytanie odnośnie auto, bo widze to juz ktorys raz z kolei. Lepiej jest to stosowac od zwyklego zapisu w petli for, tzn z inicjalizavja i deklaracja iteratora?
komentarz 3 sierpnia 2019 przez RafalS VIP (122,820 p.)

Jeśli pytasz o to:

for (auto para : mapa)

to warto, bo jest krócej i czytelniej jeśli potrzebujesz przeiterować po wszystkich elementach

komentarz 3 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
Ale z technicznego punktu widzenia bez różnicy.
komentarz 3 sierpnia 2019 przez wik90210 Nowicjusz (120 p.)

@RafalS,
 Dziękuję za odpowiedź, szukałam dość długo jak napisać tę pętlę i jakoś nie udało mi się znaleźć. W końcu mogę ruszyć z miejsca. :)

Co do formatowania kodu - wrzuciłam tylko fragment, by nie marnować miejsca (chociaż to mogło być złe posunięcie), a kod zmieniałam setki razy i desperacko skupiłam się tylko na tym, by działał, a nie na tym, jak wygląda, ale na pewno sobie to wezmę do serca.

+2 głosów
odpowiedź 3 sierpnia 2019 przez mokrowski Mędrzec (156,220 p.)
include <string>
#include <vector>
#include <unordered_map>
#include <iostream>

int main()
{
    std::string slowo;
    std::cin >> slowo;
    // (1) W jakim celu chcesz sortować? std::map sortuje wg. klucza.
    //     Tu to niepotrzebne. Wystarczy std::unordered_map
    // (2) Czy przewidujesz ujemną ilość wystąpień?
    //     Jeśli nie to nie typ int tylko unsigned.
    std::unordered_map<char, unsigned> mapa;
    std::vector<unsigned> ile;

    // Lepiej wyrażać brak intencji kopiowania poprzez stałą
    // referencję. Dla małych typów i tak kompilator się
    // zorientuje a w kodzie jest to bardziej przekonujące.
    for(const auto& c: slowo) {
        ++mapa[c];
    }

    // Znów stała referencja by nie zmieniać wartości.
    for(const auto& pr: mapa) {
        std::cout << pr.first << ' ' << pr.second << '\n';
    }

    // Jeśli wiesz ile jest elementów w mapie, rezerwując
    // pamięć w wektorze unikniesz zbędnych realokacji
    // danych w wektorze.
    ile.reserve(mapa.size());

    // emplace_back(...) wpisuje elementy w przygotowanej
    // pamięci. Znów tu mały typ i kompilator sam wie co ma
    // zrobić, ale wygląda lepiej.
    for(const auto& pr: mapa) {
        ile.emplace_back(pr.second);
    }

}

 

komentarz 4 sierpnia 2019 przez wik90210 Nowicjusz (120 p.)
Bardzo dziękuję za wyczerpującą odpowiedź, postaram sie te zmiany wprowadzic w zycie, bo naprawdę mam sporo złych nawykow
+1 głos
odpowiedź 3 sierpnia 2019 przez niezalogowany
Może to nie jest odpowiedz na twoje pytanie, ale tu https://www.youtube.com/watch?v=bFSnXNIsK4A. na pewno znajdziesz parę odpowiedzi dotyczące STL.

Podobne pytania

0 głosów
1 odpowiedź 202 wizyt
pytanie zadane 25 lutego 2021 w Java przez Lulex Użytkownik (820 p.)
0 głosów
1 odpowiedź 733 wizyt
+1 głos
2 odpowiedzi 192 wizyt
pytanie zadane 4 września 2016 w C i C++ przez Pesio Użytkownik (760 p.)

92,687 zapytań

141,599 odpowiedzi

320,089 komentarzy

62,048 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

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!

...