Klasa String w C++. Obszerna analiza

Cześć!

Jak przygoda z programowaniem ? Mam nadzieję, że całkiem ciekawie. Dzisiaj zajmiemy się tematem dla jednych ciekawym, a dla innych jeszcze bardziej ciekawym. Zainteresowany ? Zapraszam.

String, co to takiego ? Klasa string jest połączeniem tablicą charów. Czym jest "char"? To pojedyńczy znak, który wewnątrz siebie jest liczbą(może być zarówno dodatnią, jak i ujemną), która reprezentuje znaki w standardzie UTF8. Tablica String jest tablicą ciągłą, to oznacza że znajduje się nieprzerwanie w pamięci od początku, aż do końca. Element pierwszy ma indeks zerowy. Ostatni indeks ma zawsze znacznik '\0'. Dlaczego ? String jest tablicą ciągłą i kompilator musi wiedzieć gdzie się kończy.

Jak wygląda deklaracja string w c++?

std::string myString;

W ten sposób. Napiszmy więc związany z Nim najprostszy kod.

#include <iostream>
#include <string>///Library for String

int main()
{

std::string myString = "Ala ma kota, ale nie Filemona";

}
Dodajmy teraz do tego wyrazu coś więcej dodając do Niego drugiego stringa:

#include <iostream>
#include <string>///Library for String

int main()
{

std::string myString = "Ala ma kota";
myString+=",ale nie Filemona";
std::cout<<myString<<'\n';
}

Zróbmy coś więcej z tym kodem. Spróbujmy usunąć spacje. Kod nie będzie prosty i będzie zawierał proste wyrażenie lambda

#include <iostream>
#include <string>///Library for String
#include <algorithm>

void removeString(std::string &nameStringToRemove)
{

std::remove_if(nameStringToRemove.begin(),nameStringToRemove.end(),
[](char x){
return std::isspace(x);
});

}
int main()
{

    std::string myString = "Ala ma kota, ale nie Filemona";

    removeString(myString);

    std::cout<<myString<<'\n';


}

Pojawiły się dwie nowości. Pierwsza to biblioteka algorithm, kolejnym jest remove_if. Pierwsze z Nich jest biblioteką dla remove_if, w której się ona znajduje. Natomiast ono samo ma konstrukcję: std::remove_if(std::string.begin(),std::string.end(),UNARY PREDICATE); Ostatnia rzecz mogła wywołać sporo niepokoju. Unary predicate to coś, co spełnia warunek samego predicate, które to z kolei ma warunek, że musi być tutaj zwrócony bool, oraz dostaje pojedyńczy argument, w tym przypadku char. I tyle.



Remove_if jak sama nazwa mówi usuwa, w zależności od trzeciego argumentu. Oczywiście możemy chcieć usunąć tylko część argumentów. Dajmy np. 4 miejsca od początku. Programowanie to wolność i nikt tego nie zabroni. Pomijając to, że rzadko kiedy chcemy usunąć coś do połowy, a resztę zostawić. Tak czy inaczej, kod będzie wygląd w następujący sposób:

#include <iostream>
#include <string>///Library for String
#include <algorithm>

void removeString(std::string &nameStringToRemove)
{

std::remove_if(nameStringToRemove.begin(),nameStringToRemove.begin()+4,
[](char x){
return std::isspace(x);
});

}
int main()
{

    std::string myString = "Ala ma kota, ale nie Filemona";

    removeString(myString);

    std::cout<<myString<<'\n';


}


Kolejna ciekawa rzecz: Konwersja z innych typów. Dajmy prosty przykład. Mamy liczbę int myInt = 100; Z której chcemy zrobić Stringa. Sposobów jest kilka. Ja pokaże 2. Pierwszy będzie nieco bardziej skomplikowany, ale nie wymaga kompilatora C++11, drugi będzie go wymagał. Więc do rzeczy:

1.

#include <iostream>
#include <string>
#include <sstream>///Library for stringstream

void convertToString(int myInt,std::string &myString)
{

std::stringstream ss;
ss<<myInt;

myString = ss.str();

}


int main()
{

    std::string myString = "Ala ma kota, ale nie Filemona";

    int myInt = 100;
    convertToString(myInt,myString);

    std::cout<<myString<<'\n';

}

Wygląda przerażająco ? Czas na małe wyjaśnienie. std::stringstream jest jak sama nazwa mówi strumieniem stringów. Czymś co będzie służyło do operacji na stringach. Strumień może coś zmieniać. Może operować na danych wyjściowych i wejściowych. Dla przesunięcia binarnego w lewo <<(na powyższym przykładzie), zawartość danych jest konwertowana do strumienia. I przechowywana w bufforze, z którego później konwertujemy do std::string metodą str(); Istnieje również druga metoda str(std::string), która ustawia zawartość bufora stringiem.
Jako ciekawostkę warto dodać, że istnieje również przypisania std::stringstream do inta. Robi się to przeciwnie jak do stringa.

void convertToInt(int &myInt,int &secondInt)
{

std::stringstream ss;
ss<<100<<' '<<200;

ss>>myInt>>secondInt;
std::cout<<myInt<<" "<<secondInt<<'\n';
}


2.
 #include <iostream>
#include <string>


void convertToString(int myInt,std::string &myString)
{

myString=std::to_string(myInt);

}


int main()
{

    std::string myString = "Ala ma kota, ale nie Filemona";

    int myInt = 100;
    convertToString(myInt,myString);

    std::cout<<myString<<'\n';

}

Metoda to_string konwertuje na stringa. I zwraca wynik jako string(dlatego jest przypisanie).


Ostatnią rzeczą, którą poruszymy to znajdowanie frazy w stringu. Do tego celu jest kilka metod. Między innymi find_first_of(znajduje pierwsze wywołanie), find_last_of(ostatnie), oraz find(po prostu znajduje).

My zajmiemy się dzisiaj metodą find.

Do dzieła:

#include <iostream>
#include <string>


void findValue(std::string myString,char phaseToSearch)

{

 int positionFind = myString.find(phaseToSearch);

long long notFind=std::string::npos;

 if(positionFind!=notFind)

{



 std::cout<<"I found this phase in position: "<<positionFind<<'\n';



}


else {std::cout<<"Not find. Exit program\n";exit(-1);}



}
int main()
{

    findValue("Ala ma kota",'a');


}

Jeśli powyższy kod nie zadziała, dodaj blibliotekę cstdio, dla exit, lub i stdlib.

Co ten kod oznacza ? Wyszukuje frazę. Warte uwagi jest przede wszystkim:
 int positionFind = myString.find(phaseToSearch);
Które zwraca pozycje frazy, którą podaliśmy.
long long notFind=std::string::npos;
Zwraca pozycje losową(zazwyczaj bardzo dużą, która jest praktycznie niemożliwa do osiągnięcia przy alokacji stringa). Jeśli metoda find nie znajdzie frazy w tekście, zwraca właśnie npos(not position, czyli bez pozycji). Dzięki temu możemy szybko sprawdzić, czy podana fraza została odnaleziona w tekście.


Na zakończenie podam szybki przykład, który pokaże że string to tablica charów. Oto prosty przykład:
 #include <iostream>
#include <string>

void showString(std::string myString)

{



for(auto n:myString)

std::cout<<n<<'\n';

///Alternative for old compiler:
/*///Remove this line
for(unsigned int i =0;i<myString.size();i++)

std::cout<<myString[i]<<'\n';
*/ ///And this
}
int main()
{

    std::string myString = "Ala ma kota, ale nie Filemona";

    showString(myString);
}


Pętla for przechodzi od pierwszego elementu aż do ostatniego. Dzięki czemu można w prosty sposób sprawdzić, co kryje Nasz tekst w pojedyńczych słowach.

To byłoby na tyle. Pozdrawiam!

Komentarze

Popularne posty z tego bloga

Co dokładnie oznacza std::cout<<"Witaj Swiecie!"<<'\n''; w C++ ?

Klasy, Przestrzenie nazw, Nonlocal, Global i Local. Czy Python ma zmienne prywatne ?

Przeciążanie operatorów w C++