A basic_string
osztálysablon sok olyan alapfunkciót tartalmaz ami a karakterláncok feldolgozásához
szükséges, mint például a törlés vagy a keresés. Mindez a namespace std-ben van definiálva és ugyanitt található
a typedef basic_stringchar> string deklaráció is, amely a string álnevet adja a basic_stringchar> -nek. Egy string objektum létrehozható például a string
s1("Hello")
utasítással, amely létrehoz egy string objektumot egy const char* típusból, amely a Hello karaktereket tartalmazza a \0 terminátort leszámítva. A char* típusú karakterláncoktól eltérően a
string objektumok nem kell tartalmazzák a NULL-t az utolsó pozíción. Ha az objektumot a string s1(8, ’x’) utasítással hozzuk létre, akkor az 8
darab x karakter fog tartalmazni. Ezek mellett a string rendelkezik még implicit konstruktorral
és egy másoló konstruktorral is.
Stringek értékadása és
összefűzése
A referenciákkal létező változókra hivatkozunk, ezért minden referencia
deklarálásnál rögtön meg is kell határozni (inicializálni kell), hogy mire megy
a hivatkozás:
#include
using std::cout;
using std::endl;
#include
using std::string;
int main()
{
string
s1("cat"), s2, s3;
s2 =
s1; //értékadás
s3.assign(s1); //értékadás
assign()-el
cout
"s1: " "\ns2: " "\ns3: " "\n\n";
s2[0]
= s3[2] = 'r';
cout
"s2[0] = s3[2] = 'r':\n"
"s1: " "\ns2: " "\ns3: ";
int len = s3.length();
for(int x = 0; x len; ++x)
cout
string
s4(s1 + "apult"), s5; // s4=s1+apult, s5=""
s3 +=
"pet"; // s3=s3+pet
s1.append("acomb"); // s1=s1+"acomb"
s5.append(s1,
4, s1.size()); // s5=s1-cata
cout
"\n\nÖsszefűzés után:\n"
"s1: " "\ns2: " "\ns3: " "\ns4: " "\ns5: "
return 0;
}
A kimenet:
s1: cat
s2: cat
s3: cat
s2[0] = s3[2] =
'r':
s1: cat
s2: rat
s3: car
Összefűzés után:
s1: catacomb
s2: rat
s3: carpet
s4: catapult
s5: comb
Az s2 = s1 utasítás két objektum között tesz egyenlőséget, s2 az s1 másolata lesz. Ugyanez teszi az assign() függvény is, s3 lesz az s1 másolata. A [] operátorral elérhetőek a string elemei,
az at() függvény emellett
leellenőrzi az index korlátait is. Az append()függvény a karakterláncok összefűzését valósítja
meg. Az s5.append(s1,
4, s1.size()) utasítás
hozzáfűzi s5-höz az s1 negyedik pozíciójától számított
karaktereket.
Substringek
A string osztály substr
függvénye lehetővé teszi egy substring kivételét a stringből.
#include
using std::cout;
#include
using std::string;
int main()
{
string
s("The airplane flew away.");
cout
return 0;
}
A kimenet:
plane
A s.substr(7,5) utasítás kiveszi a 7 és 5 pozíciók közti substringet téríti vissza az s-ből.
A string objektumok
tulajdonságai
A string osztálynak egyes függvényei információt szolgáltatnak a
karakterláncról, mint a hosszúság, maximális hosszúság és kapacitás. A string
hossza az objektumban lévő karakterek pillanatnyi száma. A kapacitás az a
legnagyobb szám, amit még a string eltárolhat anélkül, hogy megnőne a számára
lefoglalt memória. A maximális hossz a string objektumnak lefoglalható
legnagyobb memória.
#include
using std::cout;
using std::cin;
#include
using std::string;
void printStats(const
string&);
int main ()
{
string
s;
cout
"Statisztikák a beolvasás
előtt:\n";
printStats(s);
cout
"\n\nOlvass be egy stringet: ";
cin
>> s;
cout
"A beolvasott string: "
"\nStatisztikák a
beolvasás után:\n";
printStats(s);
s.resize(s.length()+10);
cout
"\n\nResize után (length+10):\n";
printStats(s);
s.append("addition");
cout
"\nA beolvasott string: "
return 0;
}
void printStats(const
string& str)
{
cout
"Kapacitás: " str.capacity()
"\nMax hosszúság: " str.max_size()
"\nHosszúság: " str.size()
"\nÜres? " "igen" : "nem");
}
A kimenet:
Statisztikák a
beolvasás előtt:
Kapacitás: 0
Max hosszúság:
4611686018427387897
Hosszúság: 0
Üres? igen
Olvass be egy
stringet: onceuponatime
A beolvasott
string: onceuponatime
Statisztikák a
beolvasás után:
Kapacitás: 16
Max hosszúság:
4611686018427387897
Hosszúság: 13
Üres? nem
Resize után
(length+10):
Kapacitás: 32
Max hosszúság:
4611686018427387897
Hosszúság: 23
Üres? nem
A beolvasott
string: onceuponatime addition
A program deklarál egy string objektumot, amely eleinte üres. A
karakterlánc beolvasása után a printStats() függvény 13 hosszúságot ír ki, amit a beolvasott karakterek számára utal.
A karakterlánc számára lefoglalt kapacitás egyenlő az ehhez legközelebb álló
kettő hatványával, 16-tal. A hosszúság növelése automatikusan megnöveli a kapacitást
is. A hosszúságnövelés üres karakterek beszúrását jelenti.
Keresés a stringben
#include
using std::cout;
#include
using std::string;
int main()
{
//a fordító egyetlen stringgé alakítja a tördelt szöveget
string
s("Egy baloldali részfa elemei "
"\nkisebbek,
mint a csúcs elemei"
"\nés a
jobboldali részfa elemei"
"\nnagyobbak,
mint a csúcs elemei.");
cout
"Az eredeti szöveg:\n"
//a "részfa" substring keresése
cout
"\n\nAz első \"részfa\"
kezdete: " "részfa");
cout
"\nAz utolsó \"részfa\"
kezdete: " "részfa");
//a 'z' karakter keresése
cout
"\nAz első karakter
\"qpxz\"-ből: " "qpxz");
cout
"\nAz utolsó karakter
\"qpxz\"-ből: " "qpxz");
//a '-' karakter keresése
cout
"\nAz első karakter amely nincs benne
a \"dntusbgmcvp\"-ben: "
"dntusbgmcvp");
//a '\n' karakter keresése
cout
"\nAz utolsó karakter, amely nincs
benne a \"dntusbgmcvp\"-ben: "
"dntusbgmcvp");
return 0;
}
A kimenet:
Az eredeti szöveg:
Egy baloldali részfa elemei
kisebbek, mint a csúcs
elemei
és a jobboldali részfa
elemei
nagyobbak, mint a csúcs
elemei.
Az első "részfa"
kezdete: 14
Az utolsó "részfa"
kezdete: 75
Az első karakter
"qpxz"-ből: 17
Az utolsó karakter
"qpxz"-ből: 78
Az első karakter amely nincs
benne a "dntusbgmcvp"-ben: 0
Az utolsó karakter, amely
nincs benne a "dntusbgmcvp"-ben: 119
A main függvényben deklarálva és
inicializálva van az s
objektum. A fordító mind a 4 sort összefűzi még mielőtt a program elindulna. Az
s.find("reszfa") utasítás visszatéríti a reszfa szó kezdő pozícióját az s stringben. Ha nem találja, akkor a string::npos konstanst téríti vissza. Az s.rfind("reszfa") utasítás a legutolsó reszfa szó kezdő pozícióját téríti vissza. Az s.find_first_of("qpxz") függvény megkeresi s-ben a gpxz bármely karakterének első előfordulási helyét. Az s.find_last_of("qpxz") függvény ugyanígy az utolsó előfordulási helyet
kutatja. Az s stringben a z az amit megtalál a gpxz substringből. A s.find_first_not_of("dntusbgmcvp") utasítás azt az első olyan karaktert keresi s-ben, amely nem része a dntusbgmcvp substringnek. A s.find_last_not_of("dntusbgmcvp") pedig az utolsó olyan karaktert keresi
amely nem része ennek.
Karakterek behelyettesítése
#include
using std::cout;
#include
using std::string;
int main()
{
string
s("Egy baloldali rőszfa elemei "
"\nkisebbek, mint a csúcs elemei"
"\nés a jobboldali részfa elemei"
"\nnagyobbak, mint a csúcs elemei.");
s.erase(62);
//mindent kitöröl
62-től
cout
"A törles utan:\n"
int x = s.find("
"); //megkeresi az első szóközt
while(x != string::npos) //amíg
nincs vége a stringnek
{
s.replace(x,
1, "."); //addig
kicseréli a szóközt pontra
x=s.find(" ",x+1); //és megkeresi a
következő szóközt
}