rottingham Temat założony przez niniejszego użytkownika |
» 2018-12-10 03:13:09 @YooSy Super! Dzięki za pomoc :) Kod zdaje się działać i tym razem chyba nawet spełnia swoją funkcję :D Co można ewentualnie zrobić lepiej czy widzicie jakieś niedociągnięcia? void modyfikujemy( string & tekst ) { string a = " "; size_t czySpacja = tekst.find( " " ); if(( tekst[ czySpacja ] == a[ 0 ] ) &&( tekst[ czySpacja + 1 ] == a[ 0 ] ) ) do { tekst.erase( czySpacja, 1 ); tekst.find( " ", czySpacja + 1 ); } while( tekst[ czySpacja + 1 ] == a[ 0 ] ); do { if(( tekst[ czySpacja ] == a[ 0 ] ) &&( tekst[ czySpacja + 1 ] == a[ 0 ] ) ) do { tekst.erase( czySpacja, 1 ); tekst.find( " ", czySpacja + 1 ); } while( tekst[ czySpacja + 1 ] == a[ 0 ] ); cout << czySpacja << endl; czySpacja = tekst.find( " ", czySpacja + 1 ); } while( czySpacja != string::npos ); }
|
|
pekfos |
» 2018-12-10 10:40:18 Masz niepotrzebnie powielony kod. Zamiast szukać jednej spacji i sprawdzać, czy po niej występuje druga, możesz po prostu szukać dwóch spacji. Albo: pójdź krok dalej i usuwaj więcej niż jeden znak naraz. Taki algorytm oparty o erase jest bardzo nieefektywny, możesz go trochę przyspieszyć jeśli nie będziesz usuwać po jednym znaku. To nie jest duża modyfikacja względem kodu, który masz teraz. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2018-12-10 22:55:54 Hmm... Wyszedł mi taki kod (mam nadzieję, że dobrze załapałem Twoje wskazówki). Czy chodziło o taką optymalizację kodu? void modyfikujemy( string & tekst ) { string a = " "; size_t czySpacja = tekst.find( " " ); size_t czySpacja2 = tekst.rfind( " " ); do { if( tekst[ czySpacja ] ) do { tekst.erase( czySpacja, 1 ); tekst.find( " ", czySpacja + 1 ); } while( tekst[ czySpacja + 1 ] == a[ 0 ] ); if( tekst[ czySpacja2 ] ) do { tekst.erase( czySpacja2, 1 ); tekst.rfind( " ", czySpacja2 - 1 ); } while( tekst[ czySpacja2 ] == a[ 0 ] ); czySpacja = tekst.find( " ", czySpacja + 1 ); czySpacja2 = tekst.rfind( " ", czySpacja2 - 1 ); } while(( czySpacja != string::npos ) &&( czySpacja2 != string::npos ) ); }
|
|
pekfos |
» 2018-12-10 23:06:40 Nie o to chodziło. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2018-12-11 14:07:35 Hm... Czy do usuwania więcej niż jednego znaku na raz potrzebna mi jest metoda size?
EDIT. Czy w poprzednim kodzie popełniłem błąd bo mimo, że szukałem dwóch spacji (łańcucha znaków) to użyłem tej metody w sposób, który służy do wyszukiwania pojedynczego znaku? |
|
pekfos |
» 2018-12-11 17:12:18 Czy w poprzednim kodzie popełniłem błąd bo mimo, że szukałem dwóch spacji (łańcucha znaków) to użyłem tej metody w sposób, który służy do wyszukiwania pojedynczego znaku? |
Masz na myśli drugi argument find()? Nie wiem czy dokładnie o to pytasz, ale tak, jest tam błąd. Jak szukasz tekstu " " i usuniesz tam jeden znak, to nie możesz zrobić czySpacja + 1 w find(), bo pomijasz wtedy ten drugi znak spacji ze znalezionych dwóch. Jeśli będziesz mieć 3 spacje, to zostawisz wtedy dwie obok siebie. Generalnie kod jest bez sensu. Bez sensu używasz dwóch rodzajów wyszukiwania i bez sensu są te 2 pętle w środku trzeciej. Jeśli masz więcej niż jedną pętlę, robisz zadanie źle. Chyba, że próbujesz robić coś innego niż find-erase. Hm... Czy do usuwania więcej niż jednego znaku na raz potrzebna mi jest metoda size? |
Da się bez niej. Najlepiej zdecyduj się, co chcesz zrobić: czy po prostu zrobić zadanie (do tego wystarczy poprawnie użyć find() i erase()), czy robić lepszą wersję którą zasugerowałem. Bo wiesz.. jak chcesz robić dobrze, to najlepsze rozwiązanie nie używa erase() w ogóle ;) |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2018-12-12 01:17:04 Posłuchałem Twojej rady i zrobiłem kod wyszukujący dwie spacje: void modyfikujemy( string & tekst ) { string szukanyZnak = " "; size_t czySpacja = tekst.find( szukanyZnak ); do { if( tekst[ czySpacja ] ) do { tekst.erase( czySpacja, 1 ); } while( tekst[ czySpacja ] == tekst[ czySpacja + 1 ] ); cout << czySpacja << endl; czySpacja = tekst.find( szukanyZnak, czySpacja + szukanyZnak.size() ); } while( czySpacja != string::npos ); }
I właśnie jeszcze próbuję napisać ten efektywniejszy kod (usuwający więcej niż jeden znak jednocześnie), o którym wspominałeś. Nie mam pojęcia w jaki sposób on ma usuwać więcej niż jeden znak jednocześnie. Więc pomyślałem, że trzeba skorzystać z dwóch rodzajów metody find... A jeżeli nie... Czy mógłbyś dać ewentualnie jakąś wskazówkę? Kombinowałem do tej pory ze stworzeniem nowej zmiennej i tablicą oraz z użyciem metody size. Na razie to nic mi nie dało... Tak z ciekawości: czy kod, który w ogóle nie używa erase powinienem umieć napisać będąc na 28 rozdziale? A jeżeli tak, to czy chodzi o wykorzystanie metody insert? |
|
jankowalski25 |
» 2018-12-12 05:08:31 "[początek][usuń mnie][zostaw][skasuj][koniec]" ^ ^ "[początek][zostaw]ie][zostaw][skasuj][koniec]" ^ ^ "[początek][zostaw]ie][zostaw][skasuj][koniec]" ^ ^ "[początek][zostaw][koniec]aw][skasuj][koniec]" ^ ^ "[początek][zostaw][koniec]" Daszki oznaczają indeksy: jeden informuje o tym, skąd odczytać dane (wystarczy pomijać to, co ma być skasowane), a drugi wskazuje, gdzie je zapisać. |
|
1 « 2 » 3 4 |