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

Sortowanie vector<string>

0 głosów
1,044 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 (195,220 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ź 452 wizyt
pytanie zadane 4 listopada 2017 w C i C++ przez WaterMelon Nowicjusz (120 p.)
0 głosów
1 odpowiedź 331 wizyt
pytanie zadane 26 marca 2021 w Java przez Hubert731 Obywatel (1,650 p.)
+3 głosów
3 odpowiedzi 1,505 wizyt

93,600 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,085 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

Kursy INF.02 i INF.03
...