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:
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
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:
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.
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.
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:
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:
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!
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';
}
#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
Prześlij komentarz