Lekcja 27 - niezrozumienie zapisu
Ostatnio zmodyfikowano 2017-11-23 14:14
sair Temat założony przez niniejszego użytkownika |
Lekcja 27 - niezrozumienie zapisu » 2017-11-22 22:20:33 Witam, w lekcji 27 jako przykład podany jest kod #include <string> #include <iostream>
void szukajWszystkichFrazOdKonca( std::string & tekst, std::string szukanaFraza ) { size_t znalezionaPozycja = tekst.rfind( szukanaFraza ); if( znalezionaPozycja == std::string::npos ) { std::cout << "Nie znaleziono frazy w tekscie" << std::endl; return; } do { std::cout << "Fraza zostala odnaleziona na pozycji " << znalezionaPozycja << std::endl; if( znalezionaPozycja >= szukanaFraza.size() ) znalezionaPozycja = tekst.rfind( szukanaFraza, znalezionaPozycja - szukanaFraza.size() ); else znalezionaPozycja = std::string::npos; } while( znalezionaPozycja != std::string::npos ); }
int main() { std::string naszTekst = "Przyklad z kursu C++ (http://cpp0x.pl) - najlepszy kurs C++ w Internecie!"; szukajWszystkichFrazOdKonca( naszTekst, "C++" ); return 0; } Nie rozumiem po co od znalezionej pozycji odejmować "długość" szukanego ciagu znaków: znalezionaPozycja = tekst.rfind( szukanaFraza, znalezionaPozycja - szukanaFraza.size() ); Wydaje mi się, że skoro tekst jest przeszukiwany od końca i na ekran wypisywana pozycja znaku "C" z tekstu "C++" to w/w linijka jest zbędna a pomijanych jest kilka znaków przy następnym sprawdzaniu. Proszę o wytłumaczenie :) Dziekuję z góry. |
|
pekfos |
» 2017-11-22 23:25:43 Wydaje mi się, że skoro tekst jest przeszukiwany od końca i na ekran wypisywana pozycja znaku "C" z tekstu "C++" to w/w linijka jest zbędna a pomijanych jest kilka znaków przy następnym sprawdzaniu. |
Jak to zbędna? Przecież masz znaleźć wszystkie wystąpienia, więc ileś znaków już przeszukanych musisz pominąć. W przypadku "C++" pomijane są 2 dodatkowe znaki bez sprawdzania ich - jeśli twoim zdaniem jest to błędne, upchnij "C++" w dwóch znakach. |
|
sair Temat założony przez niniejszego użytkownika |
» 2017-11-23 08:28:35 Chodziło mi raczej o to, że wystarczy napisać znalezionaPozycja = tekst.rfind( szukanaFraza, znalezionaPozycja - 1 ); I z tym zapisem również działa. A nie rozumiem po co pomijać aż 3 znaki (dla "c++") skoro program pokazuje numer pozycji "C". Chyba że program sprawdzając od tyłu "zatrzymuje się" na znaku drugiego "+" i od niego zaczynałby kolejne sprawdzanie, a numer pozycji dla "C" należy interpretować jako początek tego ciągu? Wydaje mi sie, że troszkę zagmatwalem ale mam nadzieję że ktoś zrozumie i rozwieje moje wątpliwości;) |
|
YooSy |
» 2017-11-23 10:08:04 A nie rozumiem po co pomijać aż 3 znaki |
Tak będzie wydajniej. Jeśli szukana fraza będzie miała bardzo dużo znaków, to po co jeszcze raz przeszukiwać już znaleziony obszar tekstu, jeśli można po prostu go opuścić i zacząć szukania od pierwszego znaku za znalezioną frazą. mam nadzieję że ktoś /.../ rozwieje moje wątpliwości;) |
Debugger na pewno pomoże w zrozumieniu działania kodu. |
|
sair Temat założony przez niniejszego użytkownika |
» 2017-11-23 14:14:03 Dobra :D dzięki za odpowiedzi :) wrócę do tego za kilka dni, może wtedy mi się rozjaśni wszystko :) |
|
« 1 » |