Szkaplerny Temat założony przez niniejszego użytkownika |
Szukanie wydajniejszego rozwiązania - rozdział 3, temat "Modyfikowanie tekstu i sprawdzanie jego długości" » 2016-06-29 19:25:59 Hej, popełniłem takie oto rozwiązanie zadania domowego, by było wpasowane w 'klucz'. Choć cały kod działa poprawnie to szukam czegoś lepiej napisanego, lub po prostu w inny sposób złożonego. Głównie chodzi mi o podmianę znaków '<' i '>' na '[', ']' - jakieś lepsze rozwiązanie, czy to jest wystarczające? Szukanie podwójnej spacji - strasznie mnie to rozwiązanie gryzie (lecę po wszystkich znakach...). Nie oczekuję gotowego kodu, sam pomysł wystarczy ;) I gdyby ktoś mógł się wypowiedzieć co do czytelności kodu - czy brakuje gdzieś wolnych linii, etc. #include <iostream> #include <string> using namespace std;
string konwertuj( string napis ) { string finalny; finalny.insert( 0, napis ); for( size_t i = 0; i < finalny.length(); i++ ) { if( finalny[ i ] == '<' ) { finalny[ i ] = '['; } else if( finalny[ i ] == '>' ) { finalny[ i ] = ']'; } } for( size_t i = 0; i < finalny.length(); i++ ) { size_t miejsce = finalny.find( " " ); if( miejsce != string::npos ) { finalny.erase( miejsce, 1 ); } } return finalny; }
int main() { string wejsciowy = "<b>to jest </b> testowy napis <b>:)"; cout << konwertuj( wejsciowy ) << endl; getchar(); return 0; }
|
|
karambaHZP |
» 2016-06-29 19:47:31 string finalny; finalny.insert( 0, napis );
można prościej zainicjalizować łańcuch konstruktorem: string finalny( napis ); Szukanie podwójnej spacji jest OK. Można dodać sprawdzenie czy przed pierwszą literą są jakieś spacje. Podmiana znalezionego znaku na inny OK |
|
Szkaplerny Temat założony przez niniejszego użytkownika |
» 2016-06-29 21:53:38 Dzięki za ocenę, nie sądziłem że kod jest na tyle dobrze napisany. Co z czytelnością? Domyślam się, że mógłbym nazwy zmiennych ustawić na jakieś bardziej odnoszące się do tematu. |
|
mateczek |
» 2016-06-29 22:35:13 wydajniej zawsze można :) tylko pytanie czy jest sens. Jak chcesz poćwiczyć wydajność to polecam http://pl.spoj.com/problems/AL_01_02/ bez optymalizacji nie przejdzie
|
|
carlosmay |
» 2016-06-29 22:49:33 getchar(); Jakiego środowiska używasz? |
|
michal11 |
» 2016-06-29 23:17:34 Nie jest dobrze napisany. Przede wszystkim argument przesyłaj przez const referencję, nie potrzebujesz kopiowania. Zamiana znaków < i > na [ i ] można zrobić czytelniej ale mniej wydajnie: std::replace( finalny.begin(), finalny.end(), '<', '[' ); std::replace( finalny.begin(), finalny.end(), '>', ']' );
ew. jedną funkcją i lambdą: std::transform( finalny.begin(), finalny.end(), finalny.begin(),[]( char arg ) { return arg == '<' ? '[':( arg == '>' ? ']': arg ); } );
ale to już chyba lepszy jest twój for (tylko to formatowanie). Usuwanie spacji moim zdaniem jest bardzo nieczytelne, ja bym to zrobił tak: finalny.erase( std::unique( finalny.begin(), finalny.end(),[]( char lhs, char rhs ) { return lhs == ' ' && rhs == ' '; } ), finalny.end() );
jeżeli nie znasz lambd to wystarczy na początku zadeklarować funkcje char replaceParentheses( char arg ); bool isDoubleSpace( char lhs, char rhs );
i użyć nazwy funkcji zamiast lambdy. |
|
Szkaplerny Temat założony przez niniejszego użytkownika |
» 2016-06-30 01:00:50 @carlosmay - najnowszego VS. Wcześniej używałem system("pause"), jednak po przeczytaniu kilku postów/'rozpraw' przerzuciłem się na getchar(). Coś jest z tym nie tak? @mateczek - dzięki za link, strona wygląda na niezłe wsparcie pod przyszłe rozwijanie umiejętności. @michal11 - dzięki za krytyczne uwagi. Co do przesyłania argumentów - nie chciałem naruszać szkieletu podanego przez autora na zasadzie uczenia się pisania kodu pod czyjś sposób, ale rzeczywiście po moich wcześniejszych doświadczeniach z programowaniem wciąż zdarza mi się nie skorzystać z referencji. Co masz na myśli "tylko to formatowanie"? Dzięki za podrzucenie innych sposobów, mimo, że lambd jeszcze nie przerabiałem to przykłady przydadzą się kiedy coś z tego C++ liznę. |
|
carlosmay |
» 2016-06-30 09:11:44 Visual nie potrzebuje wymuszać zatrzymania przed zakończeniem działania programu. Klawisz F5 uruchamia program w trybie debug, natomiast Ctrl + F5 bez debug i automatycznie zatrzymuje się na koniec.
Nie trzeba nic dopisywać. |
|
« 1 » 2 |