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

Sortowanie vector<string>

Object Storage Arubacloud
0 głosów
711 wizyt
pytanie zadane 13 czerwca 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

Cześć

Za zadanie mam pobrać z pliku wypisane ciągi znaków, oddzielone od siebie znakiem nowego wiersza, potem umieścić je w 2  kontenerach  i alfabetycznie wypisać.

Program pobiera napisy z pliku , odpowiednio zapisuje w zmiennych , potem dodaje napisy do wektorów.

Dla vectora lolek program błędnie sortuje wartości, ciąg znaków w pierwszej linijce w pliku, w wyniku posortowania program zawsze umieszcza na końcu, reszta jest w porządku . 

Dla takich samych wartości w drugim pliku i w drugim vectorze nie ma problemu. 

#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>



using namespace std;

int main()
{

    ostream_iterator<string,char> out(cout," ");
    ifstream odczyt_1 ("lolek.txt");
    ifstream odczyt_2("bolek.txt");
    vector<string> bolek;
    vector<string> lolek;
    vector <string> final;

    string l;
    string b;
    string pomoc;
     char ch;

    while(odczyt_1.get(ch))
            l+=ch;


    while(odczyt_2.get(ch))
            b+=ch;

    int i = 0;

     while(i  <  l.length())
    {
        while( i < l.length())
        {
            if(l[i] == '\n')
                break;
            pomoc+=l[i];
            i++;
       }
        lolek.push_back(pomoc);
        pomoc= ' ';
        i++;
    }



    i = 0;
    while(i  <  b.length())
    {
        while( i < b.length())
        {
            if(b[i] == '\n')
                break;
            pomoc+=b[i];
            i++;
       }
        bolek.push_back(pomoc);
        pomoc= ' ';
        i++;
    }



    sort(bolek.begin(),bolek.end());
    sort(lolek.begin(),lolek.end());


    copy(lolek.begin(),lolek.end(),out); //ten wiersz jest blednie wypisany 
     cout<<endl;
    copy(bolek.begin(),bolek.end(),out);





    return 0;
}

 

//dane w pliku lolek 

a
b
c
d
e

// treść w konsoli
b
c
d
e
a

 

1
komentarz 13 czerwca 2020 przez j23 Mędrzec (194,920 p.)

Dlaczego nie użyjesz std::getline do czytania linii?

1 odpowiedź

0 głosów
odpowiedź 14 czerwca 2020 przez draghan VIP (106,230 p.)
wybrane 14 czerwca 2020 przez amtrax
 
Najlepsza

Cześć.

Twój błąd tkwi w liniach 45. i 62. Do odczytanego stringa dodajesz na początek znak spacji. Nie ma to miejsca przy pierwszej iteracji pętli z 35. linii, gdzie jeszcze zmienna pomoc jest pusta.

Takie dodane spacje skutecznie zaburzają spodziewany porządek leksykograficzny.

Jak sprawdzić że to rzeczywiście jest wina tych linii? Spróbuj zamienić te linie w taki sposób:

// to:
pomoc= ' ';
// na to:
pomoc= '.';

uruchom program i obserwuj wyniki. Albo przejedź sobie debuggerem w trybie krokowym przez Twój program i podglądaj wartości zmiennych.

Jak naprawić? Zmienić resetowanie zmiennej pomoc na poprawne* albo użyć innej metody wczytywania, np. std::getline którą proponuje j23.


*- wierzę że dasz radę zrobić to samodzielnie, ale jeśli będziesz mieć trudności - zapytaj

komentarz 14 czerwca 2020 przez amtrax Dyskutant (9,630 p.)

Dziękuje Ci za odpowiedź, 

cały program przerobiłem na sposób dużo prostszy, właśnie przy użyciu getline. 
Całość w zasadzie zamyka się w 2 pętlach

[....]

while(!odczyt_1.eof())
        {
            getline(odczyt_1,pomoc);
            lolek.push_back(pomoc);
        }

   while(!odczyt_2.eof())
   {
       getline(odczyt_2,pomoc);
       bolek.push_back(pomoc);
   }
[....]

Nie mniej jednak, jeszcze raz bardzo dziękuje za szczegółowy opis i pomoc w rozwiązaniu problemu. 
 Prostota  drugiego rozwiązania jest piękna. 

 

Pozdrowienia ;) 

komentarz 15 czerwca 2020 przez draghan VIP (106,230 p.)

Możesz to uprościć nawet bardziej:

while(getline(odczyt_1,pomoc))
{
    lolek.push_back(pomoc);
}
 
while(getline(odczyt_2,pomoc))
{
    bolek.push_back(pomoc);
}

:)

Podobne pytania

0 głosów
1 odpowiedź 307 wizyt
pytanie zadane 4 listopada 2017 w C i C++ przez WaterMelon Nowicjusz (120 p.)
0 głosów
1 odpowiedź 169 wizyt
pytanie zadane 26 marca 2021 w Java przez Hubert731 Obywatel (1,650 p.)
+3 głosów
3 odpowiedzi 995 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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!

...