C++ standard függvénytár
A standard C++ könyvtár egy objektum-orientált könyvtár. Ebben a nagy részben ismertetem a főbb osztályait.
Ezek a standard C++ dolgok, mindahányan az std
névtérben vannak definiálva.
Ezért a C++ forráskódoknak szinte elengedhetetlen része egy using namespace std;
sor.
A C++ standard függvénytár hatalmas, már a tartalomjegyzéken is jelentős idő végiggörgetni...
Szerk: Közben lett C++11, 14, 17, 20 és nem sokára 23 is lesz. Ezeket nem tartalmazza az alábbi írás, mert még azelőtt írtam mielőtt azok elterjedtek volna. Javaslom a Cpp Reference-t használni, hogy a legfrissebb dolgokat is elérd.
Tartalomjegyzék
- C standard könyvtár C++ megfelelői
-
IOStream objektumkönyvtár
- Definiált objektumai
- Definiált típusai
-
ios_base osztály tagjai
- Belső típusok
- Konstruktorok és = operátor
- Destruktor
- flags – formátum jelzőbitek lekérdezése, beállítása
- setf metódus – egyes jelzőbitek bekapcsolása
- unsetf – egyes jelzőbitek törlése
- precision – Értékes számjegyek számának a beállítása
- width – mezőszélesség beállítása
- imbue – locale beállítása.
- getloc – aktuális locale lekérdezése
- xalloc – hely foglalása felhasználói adatnak
- iword – felhasználói adatterület elérése (számokhoz)
- pword – felhasználói adatterület elérése (mutatókhoz)
- register_callback – saját eseménykezelő regisztrálása
- sync_with_stdio – szinkronizálás a C stdio-val
-
Az ios osztály tagjai
- Konstruktorok
- Destruktor
- good – hibaállapotban vagyunk-e
- eof – adatfolyam végén vagyunk-e
- fail – sikertelen volt-e az előző művelet
- bad – hibás-e az adatfolyam
- ! operátor – hiba történt-e?
-
A
void*
-ra típuskényszerítő operátor – hiba esetén NULL - rdstate – státuszlekérés
- setstate – státuszbeállítás
- clear – státuszbitek törlése vagy beállítása
- copyfmt – formátum jelzőbitek átvétele
- fill – kitöltő karakter beállítása
- exceptions – kivételdobás beállítása
- imbue – locale beállítása
- tie – kimeneti adatfolyam kötése az aktuális adatfolyamhoz
- rdbuf – adatfolyam puffer beállítása vagy lekérdezése
- narrow – nyelvspecifikus karakter fordítása a standardra
- widen – standard karakter átalakítása nyelvspecifikusra
-
Az istream osztály tagjai
- Belső típusok
- Konstruktor
- Destruktor
- A >> operátor – adatok olvasása az adatfolyamból
- gcount – hány karaktert olvastunk be?
- get – karakterek beolvasása az adatfolyamból
- getline – sor beolvasása az adatfolyamból
- ignore – karakterek figyelmen kívül hagyása
- peek – mi a soron következő karakter?
- read – byte-ok beolvasása adatfolyamból
- readsome – byte-ok beolvasása adatfolyamból, de csak a belső pufferből
- putback – visszatesz egy karaktert az adatfolyamba
- unget – visszateszi az előzőleg beolvasott karaktert
- tellg – hol vagyunk az input adatfolyamban?
- seekg – adatfolyamban a bemeneti pozíció beállítása
- sync – adatfolyam szinkronizálása az input forrással
- Az ostream osztály elemei
- Az iostream tagjai
-
A streambuf tagjai
- Konstruktor
- Destruktor
- pubimbue – nyelvi beállítás a pufferen
- getloc – nyelvi beállítás lekérdezése
- pubsetbuf – puffer terület beállítása
- pubseekoff – pozíció beállítása a pufferben
- pubseekpos – pozíció beállítása a pufferben
- pubsync – puffer szinkronizálása a kapcsolódó adatforrással
- in_avail – mennyi beolvasható karakter van a pufferben?
- snextc – előreléptetés majd az ottani karakter kiolvasása
- sbumpc – aktuális karakter kiolvasása, majd előreléptetés
- sgetc – aktuális pozíción lévő karakter kiolvasása
- sgetn – byte-ok beolvasása a tömbbe
- sputbackc – visszateszi a megadott karaktert a pufferbe
- sungetc – legutóbb beolvasott karakter visszahelyezése
- sputc – egy karakter írása a pufferbe majd pozíció előreléptetése
- sputn – byte-ok írása a pufferbe
- Az input puffer mutatóinak lekérése (eback, gptr, egptr metódusok)
- Az output puffer mutatóinak lekérése
- gbump – olvasási mutató előreléptetése
- setg – input puffer és mutatók beállítása
- pbump – írási mutató előreléptetése
- setp – kimeneti puffer beállítása
- imbue – nyelvi beállítás beállításának a kezelője
- setbuf – a puffer beállítás kezelője
- seekoff – Pozicionálás kezelője
- seekpos – fájlmutató beállítás kezelője
- sync – szinkronizálás kezelője
- showmanyc
- xsgetn – karakterbeolvasásnak a kezelője
- underflow – puffer elfogyásának a kezelője
- uflow – puffer elfogyásának a kezelője
- pbackfail – sikertelen karakter-visszarakás kezelője
- xsputn – karakterkiírásnak a kezelője
- overflow – puffer megtelésének a kezelője
- Az ifstream, fstream és ostream osztály tagjai
- A filebuf osztály elemei
- A stringstream, istringstream, ostringstream osztályok tagjai
- A stringbuf osztály tagjai
- I/O manipulátorok
-
Standard sablonkönyvtár adatszerkezetei
- Bejárók
-
A vektor adatszerkezet
- Megadása
- Műveleteinek időbonyolultsága
- Belső típusok
- Konstruktorai
- Destruktor
- Az = operátor
- begin – bejáró a tömb elejére
- end – bejáró a tömb végére
- rbegin – fordított bejáró a tömb végére
- rend – fordított bejáró a tömb első eleme elé
- size – tömb elemeinek a száma
- max_size – elvben lehetséges maximális elemszám
- resize – tömb átméretezése
- capacity – az lefoglalt elemek száma
- empty – üres-e a tömb?
- reserve – megadott számú elem lefoglalása
- [] operátor – elem elérése
- at – elem elérése (ellenőrzött)
- front – referencia az első elemre
- back – referencia az utolsó elemre
- assign – tartalom hozzárendelése a tömbhöz
- push_back – elem hozzáadása a tömb végén
- pop_back – elem elvétele a tömb végéről
- insert – elem beszúrása
- erase – elem törlése a tömbből
- swap – két vektor tartalmának a cseréje
- clear – elemek törlése a vektorból
- get_allocator – memóriafoglaló lekérdezése
- A deque adatszerkezet
-
A list adatszerkezet
- Megadása
- A list műveleteinek időbonyolultsága
- Konstruktor
- Destruktor
- Az = operátor
- A közös metódusok
- splice – elemek átmozgatása egy másik listából
- remove – megadott értékű elemek törlése a listából
- remove_if – adott feltételnek eleget tevő elemek törlése a listából
- unique – egymás melletti azonos értékű elemek közül 1db meghagyása
- merge – két rendezett lista összefésülése
- sort – lista sorba rendezése
- reverse – megfordítja az elemek sorrendjét a listában.
-
A set adatszerkezet
- A set műveleteinek időbonyolultsága
- Megadása
- Belső típusok
- Konstruktorai
- Destruktor
- Az = operátor
- Közös metódusok a többi adatszerkezettel
- insert – elem hozzáadása a halmazhoz
- erase – elemek törlése a halmazból
- swap – két halmaz elemeinek a megcserélése
- key_comp – érték összehasonlító lekérdezése
- A value_comp – érték összehasonlító lekérdezése
- find – adott értékű elem keresése
- count – adott értékű elemek megszámolása
- lower_bound – adott értékhez felülről legközelebb álló érték keresése
- upper_bound – adott értékhez felülről legközelebb álló, vele nem egyenlő érték keresése
- equal_range – azonos értékű elemek tartományának keresése
- A multiset adatszerkezet
- A map adatszerkezet
- A multimap adatszerkezet
-
A bitset adatszerkezet
- Megadása
- Belső típusai
- Konstruktorai
- Operátorai
- [] operátor – adott helyen álló bit lekérése
- set – adott helyen lévő bit 1-re állítása
- reset – adott helyen lévő bit 0-ra állítása
- flip – adott helyen álló bit átfordítása
- to_unlong – unsigned longgá való átalakítás
- to_string – karakterlánccá alakítás
- count – egyesen álló bitek számának a lekérése
- size – bitek száma (tulajdonképpen az N sablonparaméter)
- test – 1-es-e a megadott helyen álló bit?
- any – van-e egyes bit beállítva
- none – minden bit nulla?
- Adatszerkezet adapterek
-
A karakterlánc függvénytár
-
A string osztály tagjai
- Konstruktorai
- = operátor
- Tárolóosztályokkal közös metódusok
- length – karakterlánc hossza.
- += operátor – hozzáfűzés a karakterlánchoz
- append – hozzáfűzés a karakterlánchoz
- assign – értékadás
- insert – karakterlánc beszúrása az aktuális objektumba
- erase – részkarakterlánc törlése
- replace – a karakterlánc egy részét vagy egészét cseréli le
- c_str – C karakterlánc kinyerése
- data – tárolt bináris adattal való visszatérés
- copy – C tömbbe való másolás karakterláncból
- find – keresés karakterláncban
- rfind – keresés a karakterlánc végétől visszafelé
- find_first_of – adott karakterlánc karaktereinek a keresése
- find_last_of – adott karakterlánc karaktereinek a keresése visszafelé
- find_first_not_of – adott karakterlánc karaktereitől különböző karakterek keresése
- find_last_not_of – adott karakterlánc karaktereitől különböző karakterek keresése hátulról
- substr – részkarakterlánc képzése
- compare – két karakterlánc összehasonlítása
-
A char_traits sablon
- Megadása
- Előredefiniált specializációi
- Belső típusai
-
Szükséges metódusok
- assign – értékadás
- eq – egyenlőség
- lt – kisebb-e
- compare – karakterlánc-összehasonlítás
- length – karakterlánchossz
- find – karakterkeresés karakterláncban
- move – részkarakterlánc mozgatása
- copy – részkarakterlánc másolása
- assign – tömb feltöltése adott karakterrel
- eof – a fájlvég jel értéke
- not_eof – fájlvég-e a karakter
- to_char_type – egészből karakterré konvertál
- to_int_type – karakterből intté konvertál
- eq_int_type – két egész számot hasonlít össze
- Globális operátorok és függvények
-
A string osztály tagjai
-
Algoritmus függvénytár
- Sablonparaméterek
-
Nem módosító algoritmusok
- for_each – adott lista minden elemén elvégzi a megadott műveletet
- find – érték keresése
- find_if – keresés feltétel alapján
- find_end – egyik lista utolsó előfordulásának megkeresése a másikban
- find_first_of – adott elemek közül az első megkeresése a listában
- adjacent_find – azonos értékű elemek megkeresése
- count – megszámolja az adott értékű elemeket a megadott listában
- count_if – adott feltételnek megfelelő elemek megszámolása
- mismatch – a különbség helyének a megkeresése
- equal – összehasonlít két listát
- search – egyik lista megkeresése a másik listában
- search_n – n egymás mellett lévő elem megkeresése
-
Módosító algoritmusok
- copy – lista másolása
- copy_backward – lista másolása visszafelé
- swap – két elem értékének cseréje
- swap_ranges – két lista tartalmának megcserélése
- iter_swap – két bejáró által mutatott érték cseréje
- transform – egy vagy két lista transzformálása
- replace – elemek keresése és cseréje
- replace_if – megadott feltételnek eleget tevő elemek cseréje
- replace_copy – megadott tartomány másolása, miközben adott értékű elemeket lecserélik
- replace_copy_if – megadott tartomány másolása, miközben a megadott feltételnek eleget tevő elemeket cseréljük
- fill – terület feltöltése adott értékkel
- fill_n – n elem feltöltése adott értékkel, adott kezdőhelytől kezdve
- generate – terület feltöltése függvény által generált értékekkel
- generate_n – adott kezdőponttól kezdve n db elem beállítása és feltöltése értékekkel
- remove – adott értékű elemek törlése a tartományból
- remove_if – adott feltételnek megfelelő értékek törlése a tartományból
- remove_copy – tartomány másolása adott értékek nélkül
- remove_copy_if – tartomány másolása adott feltételnek eleget tevő elemek nélkül
- unique – egymás lévő elemek közül 1 db meghagyása, a többi törlése
- unique_copy – másolás, miközben az egymás mellett lévő elemek közül 1 db meghagyása, a többi törlése
- reverse – elemek sorrendjének a megfordítása
- reverse_copy – elemek másolása fordított sorrendben
- rotate – tartomány forgatása, amíg az adott elem adott helyre nem kerül
- rotate_copy – másolás, közben tartomány forgatása, amíg az adott elem adott helyre nem kerül
- random_shuffle – tartomány összekeverése
- partition – adott tulajdonságú elemek előre rendezése
- stable_partition – adott tulajdonságú elemek előre rendezése, sorrendjüket megtartva
-
Rendező algoritmusok
- sort – rendezi a megadott tartományt
- stable_sort – sorba rendezi a tartományt, azonos értékű elemek
- partial_sort – rendezés, amíg az adott elem a végleges helyére nem kerül
- partial_sort_copy – másol, közben rendezés, amíg az adott elem a végleges helyére nem kerül
- nth_element – rendezett sorozatban helyére teszi az n. elemet
- Bináris keresés
- Halmazműveletek rendezett tartományokon
- Kupac műveletek
-
Egyéb algoritmusok
- min
- max
- min_element – legkisebb elemre mutató bejáró lekérdezése
- max_element – legnagyobb elemre mutató bejáró lekérdezése
- lexicographical_compare – lexikális összehasonlítás
- next_permutation – egy számsor következő permutációját állítja elő
- prev_permutation – egy számsor előző permutációját állítja elő
-
Egyéb adattípusok és függvények
- complex osztály
-
Kivételekkel kapcsolatos osztályok és függvények
- Az exception osztály
- Megadása
- bad_exception osztály
- Kivételekkel kapcsolatos adattípusok
- set_unexpected – váratlan kivétel esetén hívódó függvény beállítása
- unexpected – váratlan kivétel esetén hívódik
- set_terminate függvény – kezeletlen kivétel esetén hívandó függvényt állít be
- terminate – kezeletlen kivétel esetén hívódik
- uncaught_exception – igazzal tér vissza, ha épp van feldobva kivétel, különben hamis
- Standard funktorok
- bejáró osztályok
- limits fejléc
- A locale függvénytár
- Memóriakezelő dolgok
- A <new> fejléc
- Számsorozatokra alkalmazható algoritmusok
- Standard kivételek
- Futás közbeni típusazonosítás
- Az utility fejléc
- valarray
- Alap sablonok
C standard könyvtár C++ megfelelői
Mindegyik C fejléc elérhető a C++-ban is, viszont van nekik egy C++-osított változata. A következő módon:
stdio.h
-ből lesz a cstdio
Azaz elé teszünk egy c-t, és kiterjesztés nélkül.
A kettő között az a különbség, hogy az C++-os változat mindent egy std
nevű névtérben definiál.
IOStream objektumkönyvtár
Ezzel lehet mindenféle I/O műveletet végezni C++ módon. A következő listában foglalom össze az ebben található objektumokat. A leszármazottakat bentebb kezdve.
ios_base
(ios fejléc)-
Fő ősosztály.
ios : ios_base
(ios fejléc)-
Stream-ek fő ősosztálya.
istream : ios
(istream fejléc)-
A bemeneti adatfolyamokhoz használatos. Egy fontos példánya a
cin
, amely standard inputról való olvasásra használatos (az iostream fejlécben van).iostream : istream, ostream
(istream fejléc)-
Olyan adatfolyamokhoz használatos, amely inputot és outputot is támogat.
fstream : iostream
(fstream fejléc)- Fájlok írására és olvasására használatos.
stringstream : iostream
(sstream fejléc)- Karakterláncok írására és olvasására használatos.
ifstream : istream
(fstream fejléc)- Fájlok olvasására használatos
istringstream : istream
(sstream fejléc)- Karakterláncok input adatfolyamként való használatára való.
ostream : ios
(ostream fejléc)-
Output adatfolyamokhoz használatos. Fontos példányai a
cout
,cerr
ésclog
, ezek rendre a standard outputra, hibaeszközre és naplóeszközre írnak (ezek is az iostream fejlécben vannak).iostream : istream, ostream
(istream fejléc)-
(lásd korábban)
ofstream : iostream
(fstream fejléc)- Fájlok írására használatos.
ostringstream : iostream
(sstream fejléc)- Karakterlánc írására használatos.
streambuf
(streambuf fejléc), absztrakt osztály-
Puffer funkcionalitást biztosít.
filebuf : streambuf
(fstream fejléc)- A
streambuf
funkcionalitását implementálja, fájlokra. stringbuf : streambuf
(sstream fejléc)- A
streambuf
funkcionalitását implementálja, karakterláncokra.
Definiált objektumai
- extern istream cin
- A standard inputról (billentyűzet, stdin) olvas. A
cout
-hoz van kötve. - extern ostream cout
- A standard outputra (terminál, stdout) írhatunk a segítségével.
- extern ostream cerr
- A standard hibaeszközre (terminál, stderr), írhatunk a segítségével. Ez nincs pufferelve, így a hibaüzenet azonnal a képernyőn lesz.
- extern ostream clog
-
A standard hibaeszközre (terminál, stderr), írhatunk a segítségével.
Ez pufferelve van, így naplózáskor és sok szöveg kiírásakor gyorsabb lehet, mint a
cerr
.
Definiált típusai
- template <class stateT> class fpos
- Stream-ekben a pozíció típusa. Ez egy általános típus.
- streamoff
- Stream-ekben az eltolás típusa. Implementációfüggő, hogy micsoda, de általában egy számtípus, legalább is van egy paraméteres konstruktora, amely elfogad számot.
- streampos
-
Stream-ekben az eltolás típusa.
Implementációfüggő, hogy micsoda, de általában egy számtípus, legalább is van egy paraméteres konstruktora, amely elfogad számot.
Lényegében
typedef fpos<mbstate_t> streampos
. - streamsize
- Általánosan használt egész szám típus a méretek jelzésére, valószínűleg egy
size_t
.
ios_base osztály tagjai
Az ios_base
minden osztály alapja. Az összes adatfolyam tőle örököl. Ez egy absztrakt osztály, tehát nem példányosítható közvetlenül.
Belső típusok
event
Ez egy enum a lehetséges esemény típusokkal:
- copyfmt_event
- Az
ios::copyfmt
hívásakor történik. - erase_event
- A destruktor hívásakor történik, illetve az
ios::copyfmt
hívásának az elején - imbue_event
- Az
imbue
metódus hívásakor történik.
event_callback
Ez egy függvény mutató típus, a következő megadással:
typedef void (*event_callback) (event ev, ios_base& obj, int index);
- ev
- Az esemény típusa
- obj
- Az objektum amelyen regisztrálva van ez a függvény
- index
- Az az index, amely az eseménykezelő regisztrálásakor regisztrálva lett a függvényhez.
Ezeket a függvényeket az ios_base
osztály hívogatja bizonyos események bekövetkeztekor
A register_callback
metódusával lehet ezeket az eseménykezelőket regisztrálni.
fmtflags
Ez egy egész típus, melyekben különféle jelzőbiteket tárol az osztály. A bináris számon belül egyes jelzőbitek mezőkbe vannak összerakva. Ezekről fogok külön is írni, ha odaérünk.
A következő jelzőbitek léteznek:
Független jelzőbitek:
- boolalpha
- Beolvasáskor és kiíráskor a logikai értékeket szövegként olvassa illetve írja ("true" és "false"), ha nincs beállítva, akkor számként kezeli őket (1 és 0).
- showbase
- Kiíráskor megjeleníti a számrendszer alapját (10-es számrendszer: 123, 8-as: 0123, 16-os: 0x123)
- showpos
- Pozitív és nulla számok elé kiírja a + jelet.
- skipws
- Figyelmen kívül hagyja a kezdeti whitespace karaktereket beolvasáskor.
- unitbuf
- Minden egyes írás után kiüríti a kimenetre az adatfolyam pufferét.
- uppercase
- Nagybetűvel ír ki egyes dolgokat. Példa az hexadecimális 0x-et.
A basefield
mezőben a következő jelzőbitek bitjei egyesek, ezekkel jelzőbitekkel a kiírandó, illetve a beolvasandó szám számrendszerét lehet megadni:
- dec
- Tízes számrendszer.
- hex
- 16-os számrendszer.
- oct
- 8-as számrendszer.
A floatfield
mezőben a következő jelzőbitek bitjei egyesek, ezekkel a lebegőpontos számok kezelési módját lehet megadni:
- fixed
- Fixpontos mód azaz extra nullák ki lesznek írva. (123.456 => 123.456000
- scientific
- Tudományos mód, exponenciálisan lesznek kiírva a dolgok. (123.456 => 1.234560E+02)
- (Egyik sem)
- Ha egyik sincs beállítva, akkor automatikusan választ a kettő közül, a túl nagy számokat tudományos, a túl kicsi számokat pedig fixpontos alakban írja ki, extra nullák nélkül.
Az adjustfield
mezőben a következő jelzőbitek bitjei egyesek. Ezekkel lehet beállítani, hogy balra vagy jobbra igazítsa-e
a kimenetet a megadott mezőben (ios_base::width
-tel állítható be). A fennmaradó helyeket a megadott kitöltő karakterrel
tölti ki (az alapértelmezett a szóköz, beállítható az ios::fill
metódusával).
- left
- Balra igazít.
- right
- Jobbra igazít.
- internal
- A kiírandó dolog előjele, előtagja balra, az érték jobbra lesz igazítva, pl. hexadecimális számoknál a 0x bal oldalon lesz a szám pedig jobb oldalon. Előjel, előtag nélküli dolgoknál jobbra igazítást csinál.
iostate
Egy egész szám típus, melyben az adatfolyam állapotát lehet tárolni. A következő jelzőbitek lehetnek benne (összevagyolva):
- eofbit
- Be van állítva, ha a fájl végére értünk. Általában a fájl végére való érkezéskor a
failbit
is beállítódik. - failbit
- Be van állítva, ha az előző input művelet sikertelen volt (pl. helytelen formátum, vagy a fájl végére értünk közben). A adatfolyam használható marad a művelet után.
- badbit
- Be van állítva, ha az előző input/output művelet sikertelen volt, és a hiba mélyebbről származik (pl. meg telt a lemez). Ez egy fatális hiba, azt jelenti, hogy adatfolyam többé nem használható.
- goodbit
- 0. Az előzőek egyike sincs beállítva.
openmode
A adatfolyam megnyitási módjait tartalmazó adattípus. Értéke a következők összekombinálásából (vagy operátort alkalmazunk rájuk) áll:
- app
- (append) Hozzáfűzési mód: Minden egyes írási művelet a fájl végére történik.
- ate
- (at end) Megnyitáskor a fájl végére teszi a fájlmutatót.
- binary
- Bináris tartalomként kezeli a fájlt.
- in
- Engedélyezett a fájlból való beolvasás.
- out
- Engedélyezett a fájlba való írás.
- trunc
- Kitöröl mindent a fájlból megnyitáskor és egy üres fájlt nyit meg.
seekdir
Ez egy enum, amely tartalmazza a lehetséges fájlmutató-pozicionálási viszonyítási pontokat:
- beg
- Fájl elejétől.
- cur
- Az aktuális pozíciótól.
- end
- A fájl végétől.
failure
Az std::exception
osztályból származik, ezt az osztályt dobják bizonyos műveletek kivételként.
Init
Inicializáló objektum, melynek létrehozása biztosítja, hogy a standard adatfolyam objektumok (cout, cin, cerr, clog
),
létrejönnek, mielőtt használnánk őket.
Konstruktorok és = operátor
protected: ios_base (); private: ios_base (const ios_base&); private: ios_base& operator= (const ios_base&);
Ezek a konstruktorok kívülről nem elérhetők, így nem készíthető ezekből az osztályokból példány, csak a leszármazottaiból. Privát másoló konstruktora és = operátora miatt, az osztály példányai nem másolhatóak.
Destruktor
virtual ~ios_base();
A megsemmisülés előtt, a register_callback
metódusával regisztrált függvényeket meghívja az erase_event
eseménnyel.
flags – formátum jelzőbitek lekérdezése, beállítása
public: ios_base::fmtflags flags() const; ios_base::fmtflags flags(ios_base::fmtflags fmtfl);
A formátum jelzőbiteket lehet vele lekérdezni, illetve beállítani. A jelzőbitekről korábban volt szó. Visszatérési értéke a jelzőbitek a beállítás előtt.
setf metódus – egyes jelzőbitek bekapcsolása
public: ios_base::fmtflags setf(ios_base::fmtflags fmtfl); ios_base::fmtflags setf(ios_base::fmtflags fmtfl, ios_base::fmtflags mask);
Az első verzió beállítja 1-re azokat a jelzőbiteket, amelyek a paraméterben megadott jelzőben egyesek, a többit úgy hagyja (lényegében: uj = elozo | fmtfl
).
A második verzió beállítja azokat azokat a jelzőbit, a megadott maszkban egyesek voltak, a paraméterben megadott jelző megfelelő bitjeire. (lényegében: uj = elozo | (fmtfl & mask) & (fmtfl & ~mask)
).
Visszatérési értéke a jelzőbitek a beállítás előtt.
Példa:
cout.setf(ios_base::hex, ios_base::basefield);
Beállítja a kiírás módját hexadecimálisra.
unsetf – egyes jelzőbitek törlése
Nullázza a biteket a formátum jelzőbitek közül, ahol a megadott maszk bitjei egyesek. Szintaxis:
public: void unsetf(fmtflags maszk);
precision – Értékes számjegyek számának a beállítása
Lebegőpontos számok kiírásakor az értékes számjegyek számát állítja be.
public: streamsize precision() const; streamsize precision(streamsize precizio);
A visszatérési értéke a korábbi pontosság.
Alapértelmezett lebegőpontos módban ténylegesen az értékes jegyekre vonatkozik. Fixpontos vagy tudományos módban A tizedes pont után megjelenítendő számok számára (ha kell nullákkal kiegészítve).
width – mezőszélesség beállítása
A soron következő output művelet mezőszélességét állítja be. Szintaxis:
public: streamsize width() const; streamsize width(streamsize wide);
Az első változat lekérdezi az aktuális szélességet, a második, pedig beállítja azt.
Ezután setf
-elni lehet a left, right, internal
igazítást, ha igazítani akarunk.
Visszatérési értéke a beállítás előtti érték.
imbue – locale beállítása.
Beállítja a megadott std::locale
-t (nyelvi beállítást) az adatfolyamon. Szintaxis:
public: locale imbue(const locale& loc);
Visszatérési értéke a beállítást megelőző locale.
getloc – aktuális locale lekérdezése
Lekérdezi az aktuális locale-t.
public: locale getloc() const;
xalloc – hely foglalása felhasználói adatnak
Lefoglal egy elemet az adatfolyam belső tömbjében. Szintaxis:
public: int xalloc();
Visszatérési értéke a tömbindex.
Ez a belső tömb egy általános célú dolog, amelyben felhasználói adatokat lehet tárolni.
iword – felhasználói adatterület elérése (számokhoz)
Lekéri a belső tömb adott indexű elemének a referenciáját. Szintaxis:
public: long& iword(int idx);
Ha nincs elég elem ebben a tömbben, akkor lefoglal annyit, hogy legyen. Hiba esetén is egy érvényes referenciával tér vissza, mely a 0 értéket tartalmazza.
pword – felhasználói adatterület elérése (mutatókhoz)
Lekéri a belső tömb adott indexű elemének a referenciáját. Szintaxis:
public: void*& pword(int idx);
Ha nincs elég elem ebben a tömbben, akkor lefoglal annyit, hogy legyen. Hiba esetén is egy érvényes referenciával tér vissza, mely a 0 értéket tartalmazza. Ez a függvény mutató értékként kezeli az adott tömb elemet (tehát saját dolgok címét tárolhatjuk benne).
register_callback – saját eseménykezelő regisztrálása
Saját eseménykezelőket regisztrálhatunk ezzel a metódussal. Szintaxis:
public: void register_callback(event_callback fn, int index);
- fn
- Az eseménykezelő függvény.
- index
- Egy szám, amit majd az objektum által az eseménykezelő függvénynek, amikor az hívódik.
sync_with_stdio – szinkronizálás a C stdio-val
Beállítja, hogy szinkronizálva legyen-e C++ IOStream függvénytár a standard C stdio-val. Ennek akkor van értelme, ha a két függvénytár együtt van használva. Szintaxis:
public: static bool sync_with_stdio ( bool sync = true );
- sync
- Ha igaz, akkor be van kapcsolva a szinkronizáció, hamis esetén ki van kapcsolva.
Visszatérési értéke a beállítás előtti érték.
Az ios osztály tagjai
Ez az ősosztálya az összes adatfolyam osztálynak, örökli az ios_base
minden funkcióját, elemét, belső típusát és konstansait.
Konstruktorok
public: explicit ios(streambuf *sb);
Ez inicializálja az objektumot az init(sb)
függvény hívásával.
Azaz hozzárendeli a megadott adatfolyam puffert.
protected: ios();
Az alapértelmezett konstruktor nem inicializálja az objektumot, a leszármazottnak kell az init
függvényt hívni.
Destruktor
public: virtual ~ios();
Felszabadítja a dolgokat. De a hozzárendelt adatfolyam puffert nem törli.
good – hibaállapotban vagyunk-e
public: bool good() const;
Igazzal tér vissza, hogy ha minden minden hibabit nulla az adatfolyamon. (eof, fail, bad).
eof – adatfolyam végén vagyunk-e
public: bool eof() const;
Az eof bit értékével tér vissza (azaz az adatfolyam végén vagyunk)
fail – sikertelen volt-e az előző művelet
public: bool fail() const;
A fail bit értékével tér vissza. Általában akkor van beállítva, ha valamilyen beolvasási művelet sikertelen volt (pl. számot várt, és mi valami hülyeséget írtunk be). A fail egy enyhébb hiba, az adatfolyam továbbra is használható.
bad – hibás-e az adatfolyam
public: bool bad() const;
A bad bit értékével tér vissza. Általában akkor történik, hogy ha valami objektumtól független hiba történik (nincs elég hely a lemezen, nincs meg a fájl, stb.) Ha értéke igaz, akkor az adatfolyam nem használható tovább.
! operátor – hiba történt-e?
public: bool operator !() const;
Igazzal tér vissza, ha az bad vagy a fail bit be van állítva az objektumon. Szóval egy !stream
kifejezéssel eldönthetjük, hogy valami rossz történt.
A void*
-ra típuskényszerítő operátor – hiba esetén NULL
public: operator void*() const;
Ha a bad vagy a fail bit be van állítva, akkor értéke NULL, különben egy más érték.
Ez azért van, hogy az if (stream) ...
jellegű dolgok is működjenek,
ne csak a !
.
rdstate – státuszlekérés
public: iostate rdstate() const;
Lekérdezi a státusz biteket.
setstate – státuszbeállítás
public: void setstate(iostate state );
Beállítja a státusz biteket. Ez a függvény a korábbi státusz bitekkel összekombinálja (OR művelet) megadott paramétert.
clear – státuszbitek törlése vagy beállítása
void clear(iostate state = goodbit);
Beállítja státusz biteket, a régi értéket lecseréli az újjal. Paraméterek nélkül hívva törli az összes bitet.
copyfmt – formátum jelzőbitek átvétele
ios& copyfmt(const ios &rhs);
Átveszi az összes formátum jelzőbitet a megadott adatfolyamtól. Visszatérési értéke a *this
.
fill – kitöltő karakter beállítása
char fill() const; char fill(char fillch);
Lekérdezi vagy beállítja a kitöltő karaktert. Mezőben való kiíráskor ezzel a karakterrel tölti ki az üres helyeket. Visszatérési értéke a beállítás előtti érték.
exceptions – kivételdobás beállítása
iostate exceptions() const; void exceptions(iostate except);
Lekérdezi illetve beállítja, hogy mely státusz bitek beállításakor dobjon fel az osztály ios_base::failure
kivételt.
(Több lehetőséget is összevagyolhatunk).
imbue – locale beállítása
public: locale imbue(const locale& loc);
Beállítja a locale-t az adatfolyamon és a hozzárendelt pufferen is. Azaz hív egy ios_base::imblue(loc)
-ot, majd
a hozzárendelt pufferen is streambuf::pubimbue(loc)
-ot. Visszatérési értéke a korábbi locale lesz.
tie – kimeneti adatfolyam kötése az aktuális adatfolyamhoz
public: ostream* tie() const; ostream* tie(ostream* tiestr);
Kimeneti adatfolyamot köt az adatfolyamhoz, illetve lekérdezi azt.
A művelet visszatérési értéke a korábban hozzákötött adatfolyam.
A kötött adatfolyam mindig meghívódik a flush
metódus,
mielőtt az aktuális objektumon I/O műveletet végzünk.
A standard adatfolyamok cin, clog, cerr
a cout
-ot
kötik alap esetben.
rdbuf – adatfolyam puffer beállítása vagy lekérdezése
public: streambuf* rdbuf() const; streambuf* rdbuf(streambuf* sb);
Lekérdezi illetve beállítja az adatfolyamhoz rendelt adatfolyam puffert. A művelet visszatérési értéke a korábbi adatfolyam puffer címe.
narrow – nyelvspecifikus karakter fordítása a standardra
public: char narrow(char c, char dfault) const;
Az aktuális objektumon beállított locale-beli karaktert fordít a standard változatára, ha nem lehet fordítani, akkor a dfault
karakterrel tér vissza.
widen – standard karakter átalakítása nyelvspecifikusra
char widen(char c) const;
Az aktuális objektumon beállított locale-ra fordítja át a megadott standard locale-beli karaktert.
Az istream osztály tagjai
Ez az osztály egy input adatfolyamot reprezentál, amelyből be lehet olvasni dolgokat.
Az ios
osztályból örököl mindent.
Belső típusok
sentry
class istream::sentry { public: explicit sentry ( istream& stream, bool nincs_szokoz_kihagyas = false ); ~sentry(); operator bool() const; private: sentry (const sentry&); // nincs definiálva sentry& operator= (const sentry& ); // nincs definiálva };
Ezt az osztályt minden input művelet előtt példányosítja az istream
osztály, ennek az osztálynak a konstruktora végzi az ellenőrzést az adatfolyamon (bitek jók, szinkronizálás a kötött outputtal megvolt, stb.)
A destruktora semmit nem csinál. A bool operátor meg igazat ad, ha minden oké.
(Csak azt nem értem, hogy miért kellett ehhez osztályt csinálni?)
Konstruktor
public: explicit istream(streambuf * sb);
Inicializálja az input adatfolyamot, adott adatfolyam pufferrel.
Destruktor
public: virtual ~istream();
Megsemmisíti az objektumot, a hozzárendelt adatfolyam puffert békén hagyja.
A >> operátor – adatok olvasása az adatfolyamból
Tagfüggvények:
public: istream& operator>> (bool& val ); istream& operator>> (short& val ); istream& operator>> (unsigned short& val ); istream& operator>> (int& val ); istream& operator>> (unsigned int& val ); istream& operator>> (long& val ); istream& operator>> (unsigned long& val ); istream& operator>> (float& val ); istream& operator>> (double& val ); istream& operator>> (long double& val ); istream& operator>> (void*& val ); istream& operator>> (streambuf* sb ); istream& operator>> (istream& ( *pf )(istream&)); istream& operator>> (ios& ( *pf )(ios&)); istream& operator>> (ios_base& ( *pf )(ios_base&));
Globális függvények
istream& operator>> (istream& is, char& ch ); istream& operator>> (istream& is, signed char& ch ); istream& operator>> (istream& is, unsigned char& ch ); istream& operator>> (istream& is, char* str ); istream& operator>> (istream& is, signed char* str ); istream& operator>> (istream& is, unsigned char* str );
Ezzel az operátorral lehet beolvasni formázott dolgokat, ha a billentyűzetről akarunk beolvasni, akkor a cin
objektumot lehet használni.
Mivel az operátor visszatérési értéke maga az objektum, ezért ezt lehet láncolni tetszőleges hosszban:
int a, b, c; // Beolvasás: cin >> a >> b >> c;
Persze nem csak változókba lehet beolvasni, lehet egy másik adatfolyam pufferbe, illetve lehet manipulátor függvényeket is használni. De ezekről majd később.
Ez a függvény beállítja a fail bitet, ha a beolvasott karakterek nem értelmezhetők az adott típusként.
gcount – hány karaktert olvastunk be?
public: streamsize gcount() const;
Visszatér a legutóbbi formázatlan input műveletkor beolvasott karakterek számával.
get – karakterek beolvasása az adatfolyamból
public: int get();
Beolvas egyetlen karakter az adatfolyamból is visszatér vele.
public: istream& get(char& c);
Beolvas 1 karaktert és eltárolja a paraméterként megadott változóban. Visszatérési értéke az objektum maga.
public: istream& get(char* s, streamsize n);
Beolvas egy C karakterláncot a adatfolyamból, adott maximális hosszal. A függvény n-1
karaktert olvas be,
majd a karakterláncot lezárja egy nullás byte-tal. Szintén megáll, hogy ha egy '\n'
karakterhez ér,
de azt már nem olvassa be, hanem az input pufferben marad. Úgyszintén megáll, ha adatfolyam végéhez ért.
Visszatérési értéke az adatfolyam, amin hívták, így ezek a műveletek láncolhatók
public: istream& get(char* s, streamsize n, char delim);
Ugyanaz, mint előbb, csak itt saját elválasztót adhatunk az alapértelmezett '\n'
helyett.
public: istream& get(streambuf& sb); istream& get(streambuf& sb, char delim);
Ugyanaz, mint az előző kettő, csak ez egy adatfolyam pufferbe írja a dolgokat.
getline – sor beolvasása az adatfolyamból
public: istream& getline(char* s, streamsize n); istream& getline(char* s, streamsize n, char delim);
Beolvas egy sort az adatfolyamból az s
C tömbbe, legfeljebb n
karaktert, '\n'
-t vagy delim
karaktert sor végének használva.
A függvény akkor áll meg, hogy ha beolvasott n-1
karaktert,
ha sorvégjelet, vagy az adott elválasztót elérte (ekkor az elválasztót beolvassa, de nem adja hozzá a szöveghez),
Vagy ha fájl végére ért.
Bármely esetben lezárja a karakterláncot egy 0-ás byte-tal, és visszatérési értéke az objektum, amelyen hívták.
ignore – karakterek figyelmen kívül hagyása
public: istream& ignore(streamsize n = 1, int delim = EOF);
Beolvas, és eldob megadott számú karaktert. Akkor áll meg, hogy ha már eldobott
n
db karaktert, vagy elérte a delim
karaktert, mely
alapértelmezésben negatív, tehát nincs.
Természetesen akkor is megáll, hogy ha eléri az adatfolyam végét.
Visszatérési értéke az adatfolyam, amelyen hívták, szóval láncolható ez a dolog.
peek – mi a soron következő karakter?
public: int peek();
Megmondja az adatfolyamban a soron következő karaktert, de nem olvassa be.
read – byte-ok beolvasása adatfolyamból
public: istream& read(char* s, streamsize n);
Beolvas egy blokkot az s
tömbbe, legfeljebb n
hosszan.
A függvény akkor áll meg, ha beolvasta az n
db karaktert, vagy ha elérte az adatfolyam végét
(hogy mennyit sikerült olvasni, azt a gcount
metódus mondja meg).
readsome – byte-ok beolvasása adatfolyamból, de csak a belső pufferből
public: streamsize readsome(char* s, streamsize n);
Hasonlóképpen működik, mint a read
csak ez a lokális pufferből olvas csak,
így akkor sem valószínű, hogy eleget olvasunk, amikor még lenne mit olvasni. A függvény visszatérési
értéke a kiolvasott karakterek száma. Ez akkor hasznos, amikor valamilyen aszinkron forrásból akarunk olvasni
(pl. hálózat), mert ez a függvény azonnal visszatér, a read pedig minden esetben vár.
putback – visszatesz egy karaktert az adatfolyamba
public: istream& putback(char c);
Visszatesz egy karaktert, így a következő karakter, amit beolvasunk a visszarakott karakter lesz.
Visszatérési értéke az adatfolyam, amelyen a metódust hívták. Nincs garancia arra, hogy ez a függvény működik.
Ha a belső puffer elején járunk, akkor nem lehet semmit se visszarakni, így a badbit
beállítódik majd.
Visszatérési értéke az adatfolyam, melyen hívták.
unget – visszateszi az előzőleg beolvasott karaktert
public: istream& unget();
Ugyanaz, mint a putback
metódus, csak ez az utoljára kiolvasott karaktert teszi vissza.
Akár csak az az előzőnél, itt sincs garancia arra, hogy ez a függvény működik.
Ha a belső puffer elején járunk, akkor nem lehet semmit se visszarakni, így a badbit
beállítódik majd.
tellg – hol vagyunk az input adatfolyamban?
public: streampos tellg();
Lekérdezi a pozíciót az adatfolyamban, amelyről a következő adatot olvassuk. Ha a művelet nincs értelmezve vagy hiba történt, akkor -1-gyel tér vissza.
seekg – adatfolyamban a bemeneti pozíció beállítása
public: istream& seekg(streampos pos); istream& seekg(streamoff off, ios_base::seekdir dir);
Beállítja a pozíciót az adatfolyamban, ahonnét olvasunk majd. Az első változat abszolút pozíciót állít be. A második változat pedig egy relatívot a fájl elejéhez, végéhez vagy az aktuális pozícióhoz képest.
A fail bit beállítódik, ha a megadott pozíció nem érhető el, vagy az adatfolyam nem támogatja a pozicionálást.
Visszatérési értéke az adatfolyam, amelyen hívták.
sync – adatfolyam szinkronizálása az input forrással
public: int sync();
Csak pufferelt adatfolyamok esetén használható, szinkronizálja az adatfolyam pufferét az input forrással, lényegében üríti a tartalmát. Hogy ez ténylegesen hogyan történik, az az adott input forrástól függ. Ha a művelet sikeres volt, 0-val, ha nincs pufferelve az adatfolyam, akkor -1-gyel tér vissza. Hiba esetén beállítódik a bad bit.
Az ostream osztály elemei
Ez egy kimeneti adatfolyam osztályt valósít meg, az ios
osztályból örököl mindent.
Belső típusok
sentry
class ostream::sentry { public: explicit sentry ( ostream& os ); ~sentry(); operator bool() const; private: sentry (const sentry&); // nincs definiálva sentry& operator= (const sentry& ); // nincs definiálva };
Ugyanaz, mint az istream
esetében, a műveletek előtt végez ellenőrzéseket,
és igen, itt sem értem, hogy miért nem metódusként csinálták...
Konstruktor
public: explicit ostream(streambuf *sb);
Létrehozza a kimeneti adatfolyamot és hozzárendeli a megadott adatfolyam puffert.
Destruktor
virtual ~ostream();
Elvégzi a megsemmisülés előtti teendőket, a hozzárendelt streambuf-ot nem szabadítja fel.
<< operátor – adatok írása az adatfolyamba
Ezzel lehet adatot küldeni az adatfolyamba:
Metódusok:
public: ostream& operator<<(bool val); ostream& operator<<(short val); ostream& operator<<(unsigned short val); ostream& operator<<(int val); ostream& operator<<(unsigned int val); ostream& operator<<(long val); ostream& operator<<(unsigned long val); ostream& operator<<(float val); ostream& operator<<(double val); ostream& operator<<(long double val); ostream& operator<<(const void* val); ostream& operator<<(streambuf* sb); ostream& operator<<(ostream& (*pf)(ostream&)); ostream& operator<<(ios& (*pf)(ios&)); ostream& operator<<(ios_base& (*pf)(ios_base&));
Globális függvények:
public: ostream& operator<<(ostream& out, char c ); ostream& operator<<(ostream& out, signed char c ); ostream& operator<<(ostream& out, unsigned char c ); ostream& operator<<(ostream& out, const char* s ); ostream& operator<<(ostream& out, const signed char* s ); ostream& operator<<(ostream& out, const unsigned char* s );
Ezzel adatokat lehet formázva kiírni, az összes alap adattípus kiírható vele. A adatfolyam pufferes a puffer teljes tartalmát beírja az adatfolyamba, a függvénymutatós változat pedig I/O manipulátorokhoz van (ezekről később). A globális változatok egyetlen karakterhez, illetve C karakterláncokhoz vannak.
Az operátorok visszatérési értéke az adatfolyam maga, így ezek láncolhatók.
Egy gyakran használt kimeneti adatfolyam a cout
, amely
a standard kimenet. Példa:
cout << "Pi értéke: " << 3.1415926536
put – egyetlen karakter írása az adatfolyamba
public: ostream& put(char c);
Beír egy karaktert az adatfolyamba, visszatérési értéke az adatfolyam, így több függvény is láncolható utána. Hiba esetén a bad bit lesz beállítva.
write – byte-ok írása adatfolyamba
public: ostream& write(const char* s, streamsize n);
Beír az s
területről n
byte-ot az adatfolyamba. Visszatérési értéke az adatfolyam maga, szóval ez a dolog láncolható.
Nyilván bináris ez az írás, szóval nem fog megállni holmi 0 byte-oknál.
tellp – a kimeneti pozíció lekérése
public: streampos tellp();
Visszatér a pozícióval, ahova a kiírt dolgokat írja. Ha az adatfolyam esetén nem értelmezett a pozíció, vagy hiba történt, akkor -1-gyel tér vissza.
seekp – a kimeneti pozíció beállítása
ostream& seekp(streampos pos); ostream& seekp(streamoff eltolas, ios_base::seekdir irany);
Hasonlóan Az istream
seekg
metódusához, ez is beállítja a pozíciót, ahová írunk.
Az első abszolút pozíciót állít, a második az elejéhez, végéhez vagy az aktuális pozícióhoz relatívan.
Visszatérési értéke az adatfolyam maga. A fail bit beállítódik, ha elérhetetlen helyre akarunk pozicionálni, minden
más esetben a bad bit állítódik be.
flush – írás érvényesítése
ostream& flush();
Üríti az adatfolyam pufferét, egy réteggel lentebb küldve a módosításokat.
Az iostream tagjai
Ez az osztály tulajdonképpen örökli az istream
és az ostream
mindenét:
class iostream : public istream, public ostream { public: explicit iostream(streambuf *sb); virtual ~iostream(); }
Olyan adatfolyamokhoz használatos, amelybe írni és olvasni is lehet. Nyilván viszonylag ritka, hogy egyszerre akarjuk használni mind a két funkciót.
A streambuf tagjai
Ez egy absztrakt osztály, az adatfolyamok háttérpufferét reprezentálja.
Konstruktor
protected: streambuf();
Inicializálja az objektumot. Mivel védett, csak a leszármazottai hívhatják. Meg ahogy pár sorral fentebb írtam: absztrakt osztály.
Destruktor
virtual ~streambuf();
Felszabadítási dolgokat végez.
pubimbue – nyelvi beállítás a pufferen
public: locale pubimbue(const locale& loc);
Beállítja a megadott nyelvi beállítást az adatfolyam pufferen, a visszatérési értéke a beállítás előtti locale.
A beállítás a védett imbue
metódussal végezteti el.
getloc – nyelvi beállítás lekérdezése
public: locale getloc() const;
Lekérdezi az adatfolyam pufferen beállított locale-t.
pubsetbuf – puffer terület beállítása
public: streambuf* pubsetbuf(char* s, streamsize n);
A védett setbuf
metódust hívja, mely beállítja a megadott n
méretű s
tömböt.
Ha mindkettő paraméter nulla, akkor az objektum puffer nélküli lesz.
Siker esetén a pufferrel magával tér vissza, különben NULL mutatóval.
pubseekoff – pozíció beállítása a pufferben
public: streampos pubseekoff( streamoff eltolas, ios_base::seekdir origo, ios_base::openmode ezt = ios_base::in | ios_base::out );
Beállítja a pozíciót a pufferen eltolas
helyre,
origo
relatív pozícióhoz képest,
valamint, hogy az input vagy az output pozíciót (ezt
)
kell-e beállítani. Visszatérési értéke a beállított pozíció.
A védett seekoff
metódust hívja.
pubseekpos – pozíció beállítása a pufferben
public: streampos pubseekpos( streampos pos, ios_base::openmode which = ios_base::in | ios_base::out );
Ez is beállítja az adatfolyam pufferben az aktuális pozíciót, csak egy mindig abszolút pozícióra állítja.
A védett seekpos
metódust hívja.
A többi paraméterei és visszatérési megegyezik az előző metóduséval.
pubsync – puffer szinkronizálása a kapcsolódó adatforrással
public: int pubsync();
Meghívja a védett sync
metódust. A feladata az, hogy szinkronizálja a puffert a kapcsolódó eszközzel,
kimeneti puffer esetén pl. kiírja az eszközre a dolgokat, bemenetinél egyszerűen eldobja a tartalmát.
Visszatérési értéke sikeres futás esetén 0, különben -1.
in_avail – mennyi beolvasható karakter van a pufferben?
public: streamsize in_avail();
Visszatér a beolvasható karakterek számával (input műveletek esetén). Ez kétféleképpen történhet:
- Ha az olvasási pozíció kisebb a vég pozíciónál, akkor a kettő különbségét adja vissza.
-
Ha az olvasási pozíció NULL (mert nincs belső puffer), vagy a mutató már a puffer végén van,
akkor azon karakterek számával tér vissza, amely egy
underflow
hívás után rendelkezésre állna, ezt a védettshowmanyc
függvény segítségével éri el.
snextc – előreléptetés majd az ottani karakter kiolvasása
public: int snextc();
Előrelépteti az olvasási pozíciót, majd visszatér az újonnan mutatott karakterrel.
Ha nem tud karaktert olvasni, mert végig értünk az adatfolyamon, akkor az EOF konstans értékével tér vissza.
Ez hívja az uflow
védett metódust, ha a mutató a puffer végére ért.
sbumpc – aktuális karakter kiolvasása, majd előreléptetés
public: int sbumpc();
Először kiolvassa az olvasási pozíció által mutatott karaktert, majd előre lépteti a mutatót.
Ha nem tud karaktert olvasni, mert az olvasási mutató már az adatfolyam puffer végén áll, akkor az EOF konstans értékével tér vissza.
Ez is hívja az uflow
védett metódust, ha a mutató a puffer végére ért.
sgetc – aktuális pozíción lévő karakter kiolvasása
public: int sgetc();
Visszatér az olvasási mutató által mutatott karakterrel. Ha mutató a puffer végén áll, akkor az underflow
védett
metódust hívja, hogy újratöltse a puffert, ha ez nem sikerül, akkor az EOF karakterrel tér vissza.
Ez a függvény nem mozgatja előre az olvasási pozíciót.
sgetn – byte-ok beolvasása a tömbbe
public: streamsize sgetn(char *s, streamsize n );
Beolvas n
darab karaktert (byte-ot), az s
által mutatott helyre.
A beolvasást az xsgetn
védett függvénnyel végzi. Visszatérési értéke
a karakterek száma, amennyit sikerült beolvasni a pufferből. Ez lehet n
vagy kevesebb.
sputbackc – visszateszi a megadott karaktert a pufferbe
public: int sputbackc(char c);
Visszateszi a c
karaktert a beolvasandó karakterek közé. Lényegében úgy,
hogy eggyel visszalépteti a beolvasási mutatót, és arra a helyre beírja a c
értékét.
Ha a már ott lévő karakterrel nem egyezik meg az érték, vagy mutató már a puffer elején áll, a
akkor a pbackfail
függvényt hívja a c
paraméterrel, amely
vagy visszarakja a karaktert, vagy EOF-fal tér vissza.
A függvény visszatérési értéke a visszatett karakter, vagy EOF, ha nem sikerült visszatenni.
sungetc – legutóbb beolvasott karakter visszahelyezése
public: int sungetc();
Újra elérhetővé teszi a legutóbb beolvasott karaktert, a pbackfail
védett függvényt
hívja, hogy ha a beolvasási mutató a puffer elején áll. A függvény visszatérési értéke a karakter,
amit amit újra beolvashatunk, vagy EOF, ha a puffer elején vagyunk.
sputc – egy karakter írása a pufferbe majd pozíció előreléptetése
public: int sputc(char c);
A megadott karaktert eltárolja az aktuális kiírási pozíción, majd előre lépteti a kiírási pozíciót.
Ez meghívja az overflow
védett függvényt, ha a kiírási mutató a
kiírási puffer végére mutat. Sikeres kiírás esetén a kiírt karakterrel tér vissza, különben az EOF értékével.
sputn – byte-ok írása a pufferbe
public: streamsize sputn(const char * s, streamsize n);
Az s
helyről, n
db karaktert ír a pufferbe a kiírási pozíciótól kezdve.
Ezt a feladatot az xsputn
védett függvénnyel végezteti el. A művelet úgy történik, mintha
sok sputc
függvényt hívtunk volna egymás után, amíg az első EOF-fal nem tér vissza.
Visszatérési értéke a kiírt karakterek száma, mely n
vagy annál kevesebb.
Az input puffer mutatóinak lekérése (eback, gptr, egptr metódusok)
protected: char *eback() const; char *gptr() const; char *egptr() const;
Az eback
az input puffer első byte-jára mutat.
A gptr
az aktuális olvasási pozícióra mutat.
A egptr
az input puffer vége utáni első byte-ra mutat.
Az olvasási pozíció nyilván az input pufferen belül, annak eleje és vége között van.
Az output puffer mutatóinak lekérése
protected: char *pbase() const; char *pptr() const; char *epptr() const;
A pbase
az output puffer első byte-jára mutat.
A pptr
az aktuális írási pozícióra mutat.
A epptr
az output puffer vége utáni első byte-ra mutat.
Az írási pozíció nyilván az output pufferen belül, annak eleje és vége között van.
gbump – olvasási mutató előreléptetése
protected: void gbump(int n);
Megadott számú pozícióval előre lépteti az olvasási mutatót. A művelet nincs ellenőrizve (szóval simán lehet puffer túlcsordulás, ha nem figyelünk).
setg – input puffer és mutatók beállítása
protected: void setg(char* eleje, char* kovetkezo, char* vege);
Beállítja az input puffer elejét eleje
-re, a puffer végét vege
-re, az aktuális olvasási pozíciót pedig kovetkezo
-re.
pbump – írási mutató előreléptetése
protected: void pbump(int n);
Megadott számú pozícióval előre lépteti az írási mutatót. A művelet nincs ellenőrizve (szóval simán lehet puffer túlcsordulás, ha nem figyelünk).
setp – kimeneti puffer beállítása
protected: void setp(char* eleje, char* vege);
Beállítja az input puffer elejét eleje
-re, a puffer végét vege
-re.
Hogy az írási pozíciót miért nem lehet ezzel beállítani, mint a setg
-vel az olvasásit, nem tudom...
imbue – nyelvi beállítás beállításának a kezelője
protected: virtual void imbue(const locale &loc);
A tényleges locale beállítást végzi, alapértelmezésben nem csinál semmit. A pubimbue
hívja.
setbuf – a puffer beállítás kezelője
protected: virtual streambuf *setbuf(char *s, streamsize n);
A pubsetbuf
hívja ezt, hogy a tényleges hozzárendelést elvégezze. Beállítja az s
tömböt, melynek hossza n
. Siker esetén az adatfolyam pufferrel kell visszatérni, különben NULL-lal.
Ha a két paramétere NULL, akkor adatfolyam puffer egy puffer nélküli dolog.
seekoff – Pozicionálás kezelője
protected: virtual streampos seekoff( streamoff eltolas, ios_base::seekdir innen, ios_base::openmode ezt = ios_base::in | ios_base::out );
Ez végzi a pufferben való pozicionálást, a pubseekoff
hívja ezt, hogy a pozicionálást elvégezze. Az ezt
pufferpozíciót állítja be
innen
helytől, adott eltolas
helyre.
Visszatérési értéke a beállított pozíció, -1 ha nem sikerült a beállítás.
Az alapértelmezett viselkedés az, hogy nem csinál semmit, és visszatér -1-gyel.
seekpos – fájlmutató beállítás kezelője
protected: virtual streampos seekpos( streampos sp, ios_base::openmode which = ios_base::in | ios_base::out );
Az abszolút pozícióra való beállítást végzi, a pubseekpos
függvény hívja ezt.
Paraméterezése ugyanaz, mint annak. Alapértelmezett viselkedési egyszerűen visszatér -1-gyel.
sync – szinkronizálás kezelője
protected: virtual int sync();
A tényleges szinkronizálást végzi a külső input vagy output forrással. Siker esetén 0-val, különben más értékkel tér vissza. Az alapértelmezett viselkedése az, hogy visszatér nullával.
showmanyc
protected: virtual streamsize showmanyc();
Megadja, hogy mennyi karakter lesz elérhető, miután az olvasási puffer végére értünk (és underflow
állapotában vagyunk).
Ezt az in_avail
függvény hívja az ott említett esetekben. Az alapértelmezett viselkedése az, hogy egyszerűen visszatér 0-val.
xsgetn – karakterbeolvasásnak a kezelője
protected: virtual streamsize xsgetn(char *s, streamsize n);
Az sgetn
metódus hívja ezt. Beolvas s
tömbbe n
db karaktert,
és visszatér a sikeresen beolvasott karakterek számával.
Az alapértelmezett viselkedése az sbumpc
-t hívogatja n-szer, és az első hibánál megáll, és visszatér a karakterek számával.
underflow – puffer elfogyásának a kezelője
protected: virtual int underflow();
Karakter beolvasását végzi, amikor az az olvasási pozíció a puffer végére ért. Az sgetc
hívja abban az esetben.
Ilyenkor van lehetőség előreolvasni (újratölteni a puffert), és megmondani a soron következő karaktert.
Ha nincs következő karakter, akkor a visszatérési értéke EOF
.
Az alapértelmezett viselkedése egyszerűen annyi, hogy visszatér EOF
-fal.
uflow – puffer elfogyásának a kezelője
protected: virtual int uflow();
Ugyanazt csinálja, mint az underflow
csak ez eggyel előrelépteti az olvasási pozíciót.
Ez a metódus az sbumpc
és az snextc
függvény által hívódhat.
Az alapértelmezett viselkedése az, hogy meghívja az underflow
metódust, ha
a hívás sikeres volt, akkor előrelépteti a mutatót és visszatér az visszatérési értékével, különben EOF
konstans értékével tér vissza.
pbackfail – sikertelen karakter-visszarakás kezelője
protected: virtual int pbackfail(int c = EOF);
Visszateszi a karaktert az adatfolyam pufferbe, hogyha az sputbackc
vagy a sungetc
hívásakor
nincs hely az input pufferben, vagy az ott lévő karakter nem egyezik meg a legutóbb olvasottal. Ez a függvény eldönti, hogy ekkor
mi a teendő, ha sikerült visszatennie az adott c
karaktert, akkor visszatér egy EOF
-tól különböző értékkel, ha nem, akkor
EOF
-fal. Ha a paraméter EOF
, akkor az azt jelenti, hogy az utoljára olvasott karaktert
szeretnénk újra visszatenni.
Az alapértelmezett viselkedés nem csinál semmit, egyszerűen visszatér EOF
-fal.
xsputn – karakterkiírásnak a kezelője
public: virtual streamsize xsputn(const char * s, streamsize n);
Az sputn
hívja, hogy végezze el az s
tömbből,
n
karakter kiírását az adatfolyam pufferbe.
A visszatérési értéke a sikeresen kiírt karakterek száma.
Az alapértelmezett viselkedése az, hogy az sputc
-vel karakterenként
végigmegy és kiírja a tömb elemeit, megállva, amikor az először EOF-ot kap, és visszatér
A sikeresen kiírt karakterek számával (mely lehet n
vagy kevesebb).
overflow – puffer megtelésének a kezelője
protected: virtual int overflow(int c = EOF);
Ez a függvény akkor hívódik, amikor a karaktert akart akarunk írni a kimeneti pufferbe, mikor az már megtelt
(az írási mutató a puffer végén áll). A függvény feladata az, hogy ebben az esetben is megoldja az írást
(pl. szinkronizálja a puffert, a tényleges kimenettel, és kezdje az elejéről). Ha sikerült a szükséges
előkészítés után kiírni a c
-t, akkor a visszatér egy EOF
-tól különböző értékkel,
különben EOF
-fal. Az alapértelmezett viselkedés az, hogy nem csinál semmit, csak visszatér EOF
-fal.
Az ifstream, fstream és ostream osztály tagjai
Ezek az objektumok fájlokat reprezentálnak, melyek olvasásra, írásra esetleg mindkettőre
meg vannak nyitva. Az objektumok között nagy hasonlóságok vannak, így nem szedem őket külön.
Az ifstream
az istream
osztályból,
az ofstream
az ostream
osztályból,
az fstream
az iostream
osztályból örököl.
Konstruktorok
public: ifstream::ifstream(); explicit ifstream::ifstream(const char *fajlnev, ios_base::openmode mod = ios_base::in ); ofstream::ofstream(); explicit ofstream::ofstream(const char *fajlnev, ios_base::openmode mod = ios_base::out ); fstream::fstream(); explicit fstream::fstream(const char *fajlnev, ios_base::openmode mod = ios_base::in | ios_base::out);
Ezek inicializálják az objektumot. A paraméter nélküli konstruktor nem csinál semmit. A paraméteres pedig megnyitja a megadott nevű fájlt adott módban (alapértelmezésben az adatfolyam típusának megfelelően). A fail bit beállítódik, hogy ha a konstruktor futása sikertelennek bizonyul.
Destruktor
public: virtual ifstream::~ifstream(); virtual ofstream::~ofstream(); virtual fstream::~fstream();
Ezen osztályok destruktorai bezárják a fájlt, ha korábban nem tettük volna meg a close
metódussal.
rdbuf – fájlhoz tartozó puffer lekérése
public: filebuf* rdbuf() const;
Lekéri a fájladatfolyamhoz rendelt fájl puffert.
is_open – megvan-e nyitva a fájl.
public: bool is_open();
Igazzal tér vissza, ha a fájl meg van nyitva, különben hamissal.
open – fájl megnyitása
public: void ifstream::open(const char *filename, ios_base::openmode mode = ios_base::in); void ofstream::open(const char *filename, ios_base::openmode mode = ios_base::out); void fstream::open(const char *filename, ios_base::openmode mode = ios_base::in | ios_base::out);
Megnyitja a megadott nevű fájlt, alapértelmezésben az adatfolyam típusnak megfelelő módban. Ha a megnyitás nem sikerül, akkor a fail bit beállítódik az adatfolyamon.
close – fájl bezárása
public: void close();
Bezárja a fájlt, és lemezre ment mindent. Ha ez nem sikerül, akkor a fail bit beállítódik az adatfolyamon.
A filebuf osztály elemei
Ez az osztály örökli a streambuf
funkcionalitását és alkalmazza fájlokra.
Tulajdonképpen az összes fájl adatfolyam, ennek az objektumnak a szolgáltatásait használja.
Konstruktorok
public: filebuf();
Inicializálja az objektumot.
Destruktor
public: virtual ~filebuf ();
A destruktor lezárja az alárendelt fájlt, ha azt nem tettük volna meg korábban.
is_open – fájl megnyitása
public: bool is_open();
Igazat ad vissza, hogy ha a hozzárendelt fájl meg van nyitva, különben hamisat.
open – fájl megnyitása
public: filebuf *open(const char *filename, ios_base::openmode mode);
Megnyitja a megadott nevű fájlt a megadott módban. Siker esetén önmagának címével, különben NULL mutatóval tér vissza.
close – fájl bezárása
public: filebuf *close();
Bezárja a pufferhez hozzárendelt fájlt. Siker esetén, önmaga címével, különben NULL mutatóval tér vissza.
A stringstream, istringstream, ostringstream osztályok tagjai
Ezek az osztályok tetszőleges hosszúságú karakterláncok összerakására szolgálnak. Ezen osztályokban sok a közös vonás, így nem
veszem őket külön. Az istringstream
az istream
, az ostringstream
az
ostream
, a stringstream
pedig az iostream
osztálytól örököl mindent.
Konstruktorok
public: explicit istringstream::istringstream(openmode which = ios_base::in ); explicit istringstream::istringstream(const string &str, openmode which = ios_base::in ); explicit ostringstream::ostringstream(openmode which = ios_base::out ); explicit ostringstream::ostringstream(const string &str, openmode which = ios_base::out ); explicit stringstream::stringstream(openmode which = ios_base::in | ios_base::out ); explicit stringstream::stringstream(const string & str, openmode which = ios_base::in | ios_base::out );
Inicializálja az objektumot és a tárolt karakterláncpuffert, a megadott módban, illetve van lehetőség arra, hogy megadjuk egy kezdő karakterláncot neki.
Destruktorok
public: virtual istringstream::~istringstream(); virtual ostringstream::~ostringstream(); virtual stringstream::~stringstream();
Ezek a destruktorok semmi extrát nem csinálnak, felszabadítja az adatfolyam tartalmát, és az alárendelt puffert.
rdbuf – a karakterláncpuffer lekérése
public: stringbuf* rdbuf() const;
Visszatér az adatfolyam alá rendelt karakterlánc pufferrel.
str – a tárolt karakterlánc lekérdezése
public: string str() const; void str(const string &s);
A karakterlánc pufferben tárolt karakterláncot adja vissza, illetve állítja be.
A stringbuf osztály tagjai
Ez az osztály az előbb említett karakterlánc adatfolyam osztályok puffere, a streambuf
osztályból örököl mindent.
Konstruktorok
public: explicit stringbuf(ios_base::openmode which = ios_base::in | ios_base::out ); explicit stringbuf(const string &str, ios_base::openmode which = ios_base::in | ios_base::out );
Beállítja a puffer írási módját (írás vagy olvasás), illetve beállíthat egy kezdő karakterláncot benne, tulajdonképpen a stringstream
és társai ennek direktben átadják a paramétereket.
str – tárolt karakterlánc visszaadása
public: void str(const string &s); string str() const;
A karakterlánc pufferben tárolt karakterláncot adja vissza, illetve állítja be.
Tulajdonképpen a stringstream
és társai ezt a függvényt hívják, amikor az str
metódust hívjuk rajta.
I/O manipulátorok
Ezeket a <<
illetve a >>
operátorokkal lehet adatfolyamokba küldeni, így a kiírási láncba lehet belerakni
az egyes formázásokat. Ebben a részben ismertetem őket. Ezek az <iomanip>
fejlécben vannak deklarálva.
Példa:
cout << "Tizenhatos számrendszerben írja ki: " << hex << 234 << endl; cout << "Nyolcas számrendszerben írja ki: " << oct << 123 << endl; cout << "Tízes számrendszerben írja ki: " << dec << 123 << endl;
A példában a dec
, hex
, oct
és endl
is egy I/O manipulátor,
az adatfolyamba küldve beállítják a számrendszer, az endl
pedig sort emel, és kiüríti a pufferét.
Ezek a manipulátorok tulajdonképpen függvények, de mivel így kell őket használni, ezért nem írom le, hogy hogyan lehetne meghívni őket amúgy. A következőkben (IN/OUT), (IN) és (OUT)-tal jelölöm, hogy kimeneti vagy bemenetiként használható-e az adott manipulátor.
Kapcsoló jelzőbitek
A boolalpha manipulátor (IN/OUT)
Beállítja, hogy a logikai értékeket betűvel írja ki (tehát true
és false
), alapértelmezésben számmal írja ki.
A noboolalpha
pedig kikapcsolja ezt.
A showbase manipulátor (IN/OUT)
Bekapcsolja a számrendszer alapjának jelölését. (Nyolcas esetén "0", 16-os esetén "0x"-et ír a szám elé.)
Beolvasáskor pedig elvárja, hogy azok ott legyenek. (Alapértelmezésben kikapcsolva).
Kikapcsolni a noshowbase
-szel lehet.
A showpoint manipulátor (IN/OUT)
Bekapcsolja, hogy kiírja a tizedespontot, hogy ha a szám egész érték. (alapértelmezésben kikapcsolva).
Kikapcsolni a noshowpoint
-tal lehet.
A showpos manipulátor (IN/OUT)
Bekapcsolja, hogy kiírja a + jelet a pozitív számok elé. A noshowpos
kapcsolja ki ezt.
Alapértelmezésben kikapcsolva.
A skipws manipulátor (IN/OUT)
Beolvasás elején figyelmen kívül hagyja a szóközöket és a többi whitespace karaktert. Kikapcsolni a noskipws
-sel lehet.
Alapértelmezésben be van kapcsolva.
Az uppercase manipulátor (IN/OUT)
Nagybetűket használ a kiíráskor, mindenre, ami nem karakterlánc vagy karakter, tehát a hexadecimális számokban a 0x-re és a 10 feletti, betű számjegyekre,
illetve a true és false szövegre. Kikapcsolni a nouppercase
-szel lehet. Alapértelmezésben kikapcsolva.
Az unitbuf manipulátor (IN/OUT)
Minden egyes művelet után kiüríti illetve, szinkronizálja a puffert, kikapcsolni a nounitbuf
-fal lehet. Alapértelmezésben kikapcsolva.
Számrendszert állító jelzőbitek
A dec manipulátor (IN/OUT)
Tízes számrendszerbe kapcsolja a számok kiírását/értelmezését.
A hex manipulátor (IN/OUT)
Tizenhatos számrendszerbe kapcsolja a számok kiírását/értelmezését.
A oct manipulátor (IN/OUT)
Nyolcas számrendszerbe kapcsolja a számok kiírását/értelmezését.
A setbase manipulátor (IN/OUT)
smanip setbase(int base);
Beállítja a számrendszert számmal, az értékek, amit elfogad: 8, 10, 16. (Nem értem, hogy miért... Elvileg pont az lenne a lényeg, hogy bármilyen számrendszerben tudjon kiírni.)
Igazítással kapcsolatos manipulátorok
A setw manipulátor (OUT)
smanip setw(int base);
Beállítja a mezőszélességet csak a következő kiíráshoz.
A left manipulátor (OUT)
A megadott mezőben balra igazítja a kimenetet. A jobbra igazítás az alapértelmezett.
A right manipulátor (OUT)
A megadott mezőben jobbra igazítja a kimenetet. A jobbra igazítás az alapértelmezett.
A internal manipulátor (OUT)
A megadott mezőben balra igazítja a prefixumot (előjel, 0x, stb.)és jobbra kimenetet. A jobbra igazítás az alapértelmezett.
A setfill manipulátor (OUT)
smanip setfill(char c);
Beállítja a kitöltő karaktert, ezt a karaktert fogja kiírni a mezőben üresen maradó helyekre.
Lebegőpontos manipulátorok
A fixed manipulátor (OUT)
Fixpontos módba kapcsolja a lebegőpontos számok kiírását értelmezését.
Ekkor tizedestörtként írja ki a dolgokat: (123.3456 => 123.345600)
Alapértelmezésben nincs beállítva lebegőpontos jelzőbit (ios_base::unsetf
-fel törölhető)
A scientific manipulátor (OUT)
Tudományos módba kapcsolja a lebegőpontos számok kiírását értelmezését.
Ekkor normálalakban írja ki a dolgokat: (123.3456 => 1.233456e+02)
Alapértelmezésben nincs beállítva lebegőpontos jelzőbit (ios_base::unsetf
-fel törölhető)
A setprecision manipulátor (OUT)
smanip setprecision(int n);
Beállítja a pontosságot, ez alapértelmezett módban a maximális értékes jegyek száma, fixpontos és tudományos módban a tizedestört-jegyek száma.
Karakterlánc manipulátorok
Az endl manipulátor (OUT)
Sort emel, és kiüríti a puffert. Ha nem akarunk kiüríteni egyszerűen írjunk ki egy "\n"
-t.
Az ends manipulátor (OUT)
Egy NUL karaktert (nullás byte-ot), szúr az adatfolyamba.
A ws manipulátor (IN)
Beolvasáskor annyi whitespace karaktert hagy ki, amennyit csak tud. Nyilván ennek akkor van értelme, hogy ha a skipws
ki van kapcsolva.
Egyéb manipulátorok
A flush manipulátor (OUT)
Kiüríti a kimeneti puffert (azaz, kiírja az eddig ki nem írt dolgokat a fájlba vagy a képernyőre.)
A setiosflags manipulátor (IN/OUT)
smanip setiosflags(ios_base::fmtflags mask);
Beállít jelzőbiteket. Az ios_base::setf
-fel egyenértékű.
A resetiosflags manipulátor (IN/OUT)
smanip resetiosflags(ios_base::fmtflags mask);
Töröl jelzőbiteket. Az ios_base::unsetf
-fel egyenértékű.
Standard sablonkönyvtár adatszerkezetei
Ebben a részben C++ által definiált adatszerkezetekről lesz szó. Ezek kivétel nélkül osztálysablonok, így lehetővé teszik tetszőleges típusú adat tárolását. Minden adatszerkezetnek megvan az előnye és a hátránya.
Bejárók
Az bejáró adattípus (osztály) egy mutatókkal analóg dolog: tehát az adatszerkezet egy elemére mutat, és emellett lehetővé teszi az adatszerkezetben való lépkedést,
támogatja az összehasonlító operátorokat is, hogy megállapíthassuk, hogy két bejáró azonos elemre mutat-e.
A működésük nagyon hasonlít a mutatókéra: implementálják a *
operátort, amellyel
az adott elem elérhető. A ++
és a --
operátorral lehet előre és hátra lépegetni.
A !=
és a ==
operátorokkal lehet összehasonlítást végezni.
Nagyon sok hasonlósága van a mutatókkal.
A következő táblázat foglalja össze az egyes bejáró kategóriák tulajdonságait:
Kategória | Jellemző | Példa | |||
---|---|---|---|---|---|
Mindegyik | Másolható |
X i2(i); i2 = i; |
|||
Léptethető | iter++; ++iter; |
||||
Tetszőleges elérésű | Kétirányú | Egyirányú | Bemeneti | Egyenlőségre tesztelhető | a == b a != b; |
Konstans mutatóként viselkedik. | *iter iter->mutatott_struktura_eleme |
||||
Kimeneti | Normál mutatóként viselkedik az * operátor lvalue-t eredményez. | *iter = érték; iter->mutatott_struktura_eleme = érték; | |||
Alapértelmezett konstruktora van. | Iterator iter; | ||||
Hátrafelé is lehet vele lépni | iter--; --iter; |
||||
Támogatja az aritmetikai operátorokat. | iter + szam iter - szam szam + iter szam - iter iter1 + iter2 iter1 - iter2 |
||||
Támogatja a relációs operátorokat | iter < iter2 iter <= iter2 iter > iter2 iter >= iter2 |
||||
Támogatja a += operátorokat | iter += szam iter -= szam |
||||
Támogatja a [] operátort | iter[index] |
Az adatszerkezetek használata közben gyakran fogunk bejárókkal találkozni. Az bejárók pontos leírásáról később.
A vektor adatszerkezet
A vektor egy dinamikusan növelhető tömb adatszerkezet. Úgy működik, hogy lefoglal egy folytonos területet a memóriában, amely ha megtelt lefoglal egy nagyobbat, és átmásolja oda a tartalmat. Garantálja, hogy az elemei egymást követő helyeken vannak a memóriában. A <vector> fejlécben található.
Megadása
template <class T, class Allocator = allocator<T> > class vector;
Egyetlen kötelező paramétere az elemtípus, a memóriahely-foglalót (2. argumentum) csak akkor kell megadni, hogy ha nem az alapértelmezettet akarjuk használni.
Műveleteinek időbonyolultsága
- Elem törlése
- O(n). Mivel az első elem törlésekor az összes felette lévő elemet eggyel visszább kell másolni.
- Elem beszúrása
- O(n). Mivel ha az első helyre szúrunk be, akkor az összes utána lévő elemet eggyel előrébb kell tolni.
- Elem hozzáadása a végén
- O(1), amíg nem kell új helyre másolni az egészet.
- Elem törlése a végén
- O(1), mivel nem kell előbbre másolni az egészet.
- Elem elérése index alapján.
- O(1), az elem helyét a tömb elejétől mért távolsága adja meg, ez mindig azonos idő alatt számolható.
- Keresés
- O(n), egy érték megtalálásához végig kell nézni az egész tömböt.
Belső típusok
iterator
Egy közvetlen elérésű bejáró.
const_iterator
Egy tetszőleges elérésű bejáró, viszont rajta keresztül nem módosítható a mutatott elem.
reverse_iterator
Egy tetszőleges elérésű bejáró, csak ezzel visszafelé lehet menni.
const_reverse_iterator
Egy tetszőleges elérésű bejáró, csak ezzel visszafelé lehet lépkedni, és rajta keresztül nem módosítható a mutatott elem.
size_type
Egy előjel nélküli egész szám típus, valószínűleg egy size_t
reference
Referenciatípus az elemekre. Lényegében:
typedef T& reference;
const_reference
Konstans referenciatípus az elemekre. Lényegében:
typedef const T& reference;
allocator_type
A sablon Allocator
paraméterének a típusa.
Konstruktorai
public: explicit vector(const Allocator& = Allocator());
Alapértelmezett konstruktor, létrehoz egy üres tömböt, alapértelmezett beállításokkal. Megadott memóriafoglalóval. Ha nem adunk meg memóriafoglalót, akkor az alapértelmezett konstruktorával létrehoz egyet.
public: explicit vector(size_type n, const T& value=T(), const Allocator& = Allocator());
Egy n
elemű tömböt hoz létre, value
elemekkel feltöltve.
Ha nem adunk meg értéket, annak alapértelmezett konstruktorát használja, a létrehozáshoz.
public: template <class InputIterator> vector(InputIterator eleje, InputIterator vege, const Allocator& = Allocator());
Bejárók alapján hozza létre a tömböt. A eleje
bemeneti bejárót
használva lépeget a végig egy adott adatszerkezeten, átemelve belőle az
elemeket, amíg a vege
bejárót el nem éri. Az bejárók egy
félig nyított tartományt határoznak meg.
public: vector(const vector<T,Allocator>& x);
Ez pedig a másoló konstruktor, amely egy másik vektort teljesen lemásol.
Destruktor
public: ~vector();
Az összes elem destruktorát hívja, majd felszabadítja a tömböt.
Az = operátor
public: vector<T,Allocator>& operator=(const vector<T,Allocator>& x);
Értékadás két vektor között, tulajdonképpen lemásolja az egész tömböt.
begin – bejáró a tömb elejére
public: iterator begin(); const_iterator begin() const;
Visszatér egy tetszőleges elérésű bejáróval az első elemre.
end – bejáró a tömb végére
public: iterator end(); const_iterator end() const;
Visszatér egy tetszőleges elérésű bejáróval az utolsó utáni helyre. Mi ez a tömb után mutat, ezért ezen az bejárón nem érhetünk el elemet, arra használatos, hogy lássuk, végigértünk-e a tömbön.
rbegin – fordított bejáró a tömb végére
public: reverse_iterator rbegin(); const_reverse_iterator rbegin() const;
Visszatér egy tetszőleges elérésű fordított bejáróval az utolsó elemre.
rend – fordított bejáró a tömb első eleme elé
public: reverse_iterator rend(); const_reverse_iterator rend() const;
Visszatér egy tetszőleges elérésű fordított bejáróval az első előtti helyre. Mi ez a tömb elé mutat, ezért ezen az bejárón nem érhetünk el elemet, arra használatos, hogy lássuk, végigértünk-e a tömbön.
size – tömb elemeinek a száma
public: size_type size() const;
Visszatér a tömb elemeinek a számával.
max_size – elvben lehetséges maximális elemszám
public: size_type max_size() const;
Visszatér a maximális lehetséges elemszámmal, amely . Ez lényegében a size_t
típus
maximális értéke, osztva a tömb elemtípusának a méretével.
resize – tömb átméretezése
public: void resize(size_type sz, T c = T());
Átméretezi a tömböt. Ha az sz
értéke kisebb, mint
a jelenlegi méret, akkor eldobja a felső indexű elemeket (destruktorukat hívja).
Ha nagyobb, akkor új elemeket hoz létre adott c
értékekkel.
Az átméretezés művelete érvényteleníti az elemekre mutató bejárókat és mutatókat.
capacity – az lefoglalt elemek száma
public: size_type capacity() const;
Visszatér az lefoglalt elemek számával. (Ez általában több, mint a tömbben lévő elemek száma).
empty – üres-e a tömb?
public: bool empty() const;
Igazzal tér vissza, hogy ha a tömb üres.
reserve – megadott számú elem lefoglalása
public: void reserve(size_type n);
Megváltoztatja a tömb méretét úgy, hogy legalább n
elférjen benne.
Az átméretezés művelete érvényteleníti az elemekre mutató bejárókat és mutatókat.
[] operátor – elem elérése
public: reference operator[](size_type index); const_reference operator[](size_type index) const;
Eléri a megadott indexű elemet. Fontos tudni, hogy semmi indexhatár ellenőrzés nincs, szóval ha rossz helyre indexelsz, a programod elszállhat, akárcsak a hagyományos tömbök esetén.
Természetesen az indexelés, akárcsak a tömböknél 0-tól kezdődik.
at – elem elérése (ellenőrzött)
public: const_reference at(size_type n) const; reference at(size_type n);
Ez ugyanazt csinálja, mint a [] operátor, csak ez std::out_of_range
kivételt dob.
front – referencia az első elemre
public: reference front(); const_reference front() const;
Az első elemre mutató referenciát adja vissza. Ha a tömb üres, akkor a referencia érvénytelen lesz.
(Tehát használata előtt meg kell győződni egy empty
hívással).
back – referencia az utolsó elemre
public: reference back(); const_reference back() const;
Az utolsó elemre mutató referenciát adja vissza. Ha a tömb üres, akkor a referencia érvénytelen lesz.
(Tehát használata előtt meg kell győződni egy empty
hívással).
assign – tartalom hozzárendelése a tömbhöz
public: template <class InputIterator> void assign ( InputIterator eleje, InputIterator vege ); void assign ( size_type n, const T& u );
Új tartalmat rendel hozzá a tömbhöz. A működésük lényegében ugyanaz, mint amit a konstruktorainál is említettünk már. A művelet után a korábbi elemekre mutató bejárók és mutatók érvénytelenek lesznek.
push_back – elem hozzáadása a tömb végén
public: void push_back(const T& x);
Elemet ad hozzá a tömb végén. Ha kell át is méretezi nagyobbra, hogy elférjen. (Az egyik leggyakrabban használt metódusa.) Az művelet érvénytelenítheti az elemekre mutató bejárókat és mutatókat, ha átméretezésre kerülne sor.
pop_back – elem elvétele a tömb végéről
public: void pop_back();
Törli az utolsó elemet tömbből, csökkentve a tömb méretét. A törlendő elem destruktorát hívja. Az művelet érvénytelenítheti az elemekre mutató bejárókat és mutatókat, ha átméretezésre kerülne sor.
insert – elem beszúrása
Elemet szúr be a tömbbe a ide
bejáró által mutatott elem elé.
public: iterator insert(iterator ide, const T& x);
Ez a legegyszerűbb változat beszúrja az x
értékű elemet a megadott elem elé.
public: void insert(iterator ide, size_type n, const T& x);
Ez n
darab x
értékű elemet szúr be a megadott elem elé.
public: template <class InputIterator> void insert(iterator ide, InputIterator eleje, InputIterator vege);
Ez a eleje
és a vege
bemeneti bejárók által megadott tartományon
tárolt értékeket szúrja be a tömbbe (a eleje
által mutatottat igen, a vege
által mutatottat már nem).
Az művelet érvénytelenítheti az elemekre mutató bejárókat és mutatókat, ha átméretezésre kerülne sor.
erase – elem törlése a tömbből
Elemet töröl a tömbből
public: iterator erase(iterator ezt);
Egy megadott elemre mutató bejáró alapján törli az elemet.
Visszatérési érték egy tetszőleges elérésű bejáró ezt
bejárót követő
elemre.
public: iterator erase(iterator eleje, iterator vege);
Egy első és egy utolsó félig nyitott tartomány által kijelölt tartományt töröl a tömbből.
A függvény visszatérési értéke az vege
iterator.
Az művelet érvénytelenítheti az elemekre mutató bejárókat és mutatókat, ha átméretezésre kerülne sor. A törölt elemek bejárói nyilvánvalóan érvénytelenek lesznek.
swap – két vektor tartalmának a cseréje
void swap(vector<T,Allocator>& vec);
Megcseréli két vektor tartalmát. Az bejárók és mutatók az elemekre érvényesek maradnak.
clear – elemek törlése a vektorból
public: void clear();
Törli az összes elemet a tömbből (destruktoruk hívása után). Minden elemre mutató bejáró érvénytelen lesz.
get_allocator – memóriafoglaló lekérdezése
public: allocator_type get_allocator() const;
Lekérdezi az adatszerkezet memóriafoglalóját.
A deque adatszerkezet
Ez egy két végű sor, melynek az elejére és a végére is lehet gyorsan elemeket tenni.
Nagyban hasonlít a vector
adatszerkezetre, de ez
nem garantálja, hogy az elemek pontosan egymás mellett vannak.
Egy lehetséges implementációja az, amikor egy lefoglalt memória terület elején és a végén is van szabad hely.
Az elején beszúrt elemek az eleje felé, a végén beszúrt elemek a vége felé bővítik tömböt, ha valamelyik
irányban betelik, akkor mozgatja a területen belül, vagy másik, nagyobb területre másolja át. A <deque>
fejlécben található.
Műveleteinek időbonyolultsága
- Elem törlése
- O(n). Mivel az első elem törlésekor az összes felette lévő elemet eggyel visszább kell másolni.
- Elem beszúrása
- O(n). Mivel ha a közepére szúrunk be, akkor az összes utána lévő elemet eggyel előrébb kell tolni.
- Elem hozzáadása a végén
- O(1), amíg nem kell új helyre másolni az egészet.
- Elem hozzáadása a elején
- O(1), amíg nem kell új helyre másolni az egészet.
- Elem törlése az elején
- O(1)
- Elem törlése a végén
- O(1)
- Elem elérése index alapján.
- O(1), az elem helyét a tömb elejétől mért távolsága adja meg, ez mindig azonos idő alatt számolható.
- Keresés
- O(n), egy érték megtalálásához végig kell nézni az egész tömböt.
Megadása
A következő sablonként van megadva:
template <class T, class Allocator = allocator<T> > class deque;
Működése nagyban hasonló a vector
osztályhoz
így csak a különbségeket részletezem, minden más helyen a vector
osztályra
utalok.
Konstruktorai
public: explicit deque(const Allocator& = Allocator()); explicit deque(size_type n, const T& value= T(), const Allocator& = Allocator()); template <class InputIterator> deque(InputIterator first, InputIterator last, const Allocator& = Allocator()); deque(const deque<T,Allocator>& x);
A vektoréval analóg módon működik.
Destruktorai
public: ~deque();
Meghívja minden elem destruktorát, és felszabadítja az adatszerkezetet.
Az = operátor
public: deque<T,Allocator>& operator=(const deque<T,Allocator>& x);
Felülírja egy az adatszerkezet tartalmát egy másikkal. Visszatérési értéke az objektum maga.
Metódusok, amelyek ugyanúgy működnek, mint a vektornál
- begin
- end
- rbegin
- rend
- size
- max_size
- resize
- empty
- [] operátor
- at
- front
- back
- assign
- push_back
- pop_back
- insert
- erase
- swap
- clear
- get_allocator
push_front – elem beszúrása a sor elején
public: void push_front(const T& x);
Az adatszerkezet elejére tesz egy elemet. A művelet miatt esetleg az elemekre mutató bejárók érvénytelenné válhatnak.
pop_front – elem törlése a sor elejéről
public: void pop_front();
Az adatszerkezet elejéről töröl elemet.
A list adatszerkezet
A list
osztály egy két irányban láncolt listát valósít meg.
Viszont ennek a láncolt listának a hátránya, hogy az elemeihez nem biztosít tetszőleges elérést, mindig
az elejétől kell lépkedni, hogy elérjünk egy adott elemet, erre mondjuk megoldás lehet
az, hogy a fontos elemekre mutató bejárókat eltároljuk. Az bejárói kétirányúak.
A <list>
fejlécben található.
Megadása
A következő sablonnal adják meg az osztályt:
template < class T, class Allocator = allocator<T> > class list;
Lényegében az összes adatszerkezetet ez a sablon adja meg.
A list műveleteinek időbonyolultsága
- Elem beszúrása bárhová:
- O(1): mivel csak a szomszédos elemek mutatóit kell állítani.
- Elem törlése bárhonnan:
- O(1): mivel csak a szomszédos elemek mutatóit kell átírni.
- Egy adott értéke keresése:
- O(n): mivel végig kell járni az egész listát.
- Elem elérése adott helyen:
- O(n): mivel az elejétől lépkedni kell.
Konstruktor
public: explicit list ( const Allocator& = Allocator() ); explicit list ( size_type n, const T& value = T(), const Allocator& = Allocator() ); template < class InputIterator > list ( InputIterator first, InputIterator last, const Allocator& = Allocator() ); list ( const list<T,Allocator>& x );
Inicializálják az adatszerkezetet, hasonlóképpen működnek, mint amint a vector
-nál
említettem.
Destruktor
public: ~list();
Minden elem destruktorát hívja, és felszabadítja őket.
Az = operátor
public: list<T,Allocator>& operator=(const list<T,Allocator>& x);
Felülírja a lista tartalmát egy másik listával. Minden bejáró érvénytelen lesz.
A közös metódusok
A következő metódusok hasonlóképpen működnek mint a korábban említett adatszerkezeteknél.
Részletezve a vector
és a deque
osztályoknál vannak. Ne felejtsük el, hogy a list
adatszerkezet bejárói kétirányúak (tehát nem tetszőleges elérésűek):
- begin
- end
- rbegin
- rend
- empty
- size
- max_size
- resize (ez effektíve elemeket töröl illetve elemet ad hozzá a lista végén)
- front
- back
- assign
- push_front
- push_back
- pop_front
- pop_back
- insert
- erase
- swap
- clear
splice – elemek átmozgatása egy másik listából
Egy másik listából mozgat elemeket az aktuális objektumba.
public: void splice(iterator ide, list<T,Allocator>& ezt);
A teljes ezt
lista elemeit átmozgatja a ide
bejáró által mutatott elem elé.
public: void splice(iterator ide, list<T,Allocator>& ebbol, iterator innen);
Az ebbol
lista innen
bejáró által mutatott elemét mozgatja át.
public: void splice(iterator ide, list<T,Allocator>& ebbol, iterator innen, iterator idaig);
Az ebbol
lista innen
és idaig
bejárója
által bezárt félig nyílt tartományt mozgatja át.
Az eltávolított (átmozgatott) elemekre mutató bejárók érvénytelenné válnak a művelet után.
remove – megadott értékű elemek törlése a listából
void remove(const T& ertek);
Eltávolítja a megadott értékű elemeket a listából. Az eltávolított elemekre mutató bejárók érvénytelenné válnak.
remove_if – adott feltételnek eleget tevő elemek törlése a listából
public: template <class Predicate> void remove_if(Predicate pred);
Eltávolítja az elemeket a listából, amelyek a megadott feltételnek megfelelnek. A pred
általában egy függvénymutató, valami ilyesmi:
bool (*pred)(const T &elem);
Szóval egy, a lista elemtípusával egyező, paramétere van és logikai értékkel tér vissza. A metódus minden elemmel meghívja ezt a függvényt, és ha igazzal tér vissza, akkor az adott elemet törli.
Természetesen a generikusság miatt nem muszáj, hogy függvénymutató legyen, lehet egy objektumtípus is, amely felülbírálta a () operátort.
unique – egymás melletti azonos értékű elemek közül 1db meghagyása
public: void unique(); template <class BinaryPredicate> void unique(BinaryPredicate feltetel);
Egymás melletti azonos értékű elemeket távolít el a listából (és 1-et hagy meg csak), emiatt első sorban rendezett listák esetén hasznos. Az első változata egyszerűen az == operátort használva működik. A második változata pedig egy felhasználó által megadott függvény segítségével működik, melynek a formája valami ilyesmi:
bool (*feltetel)(const T &p1, const T &p2);
Ennek a függvénynek igazat kell visszaadnia, ha a két értéket egyezőnek tekintjük, akkor az egyiket el kell távolítani a listából.
merge – két rendezett lista összefésülése
public: void merge(list<T,Allocator>& ezt); template <class Compare> void merge(list<T,Allocator>& ezt, Compare kisebbE);
Egy rendezett listát fésül bele az aktuális listába, ahhoz, hogy működjön, mind az aktuális és az ezt
-nek
is rendezettnek kell lennie. A művelet után ezt
üres lesz, mivel az elemeket átmozgattuk, az
elemeire mutató bejárók érvénytelenek lesznek.
Az első metódus az alapértelmezett < összehasonlító operátort használja, a másik pedig egy saját összehasonlító függvény segítségével, melynek a formája valami ilyesmi:
bool (*kisebbE)(const T& a, const T& b);
Ennek a függvénynek igazzal kell visszatérnie, ha a<b, különben hamissal.
sort – lista sorba rendezése
public: void sort(); template <class Compare> void sort(Compare kisebbE);
Rendezi a listát. Az első függvény az alap összehasonlító operátort (<) használja, a másik egy saját összehasonlító függvényt (lásd előbb). Az bejárók és elemekre mutató mutatók érvényesek maradnak.
A művelet időbonyolultsága O(n²).
reverse – megfordítja az elemek sorrendjét a listában.
void reverse();
Megfordítja a listában az elemek sorrendjét. Az bejárók és a mutatók az elemekre érvényesek maradnak. Időbonyolultsága O(n).
A set adatszerkezet
Ez az adatszerkezet egy halmazt valósít meg, melybe gyorsan lehet elemet beszúrni, törölni és keresni,
viszont a beszúrt elemek nem módosíthatók.
Az elemek mindig rendezetten vannak benne. Egy elem nem szerepelhet benne kétszer.
A megvalósítása általában önmagát egyensúlyozó bináris keresőfával, vagy
B-fával történik. Bejárói kétirányúak, és konstans bejárók, tehát nem módosítható rajta keresztül az érték.
A <set>
fejlécben van.
A set műveleteinek időbonyolultsága
- Elemek beszúrása:
- O(log n)
- Elem keresése:
- O(log n)
- Elem törlése:
- O(log n)
Megadása
A következő sablonnal van megadva:
template < class Key, class Compare = less<Key>, class Allocator = allocator<Key> > class set;
A Key
a tárolt elemek típusa. A Compare
az elemeket összehasonlító objektum alapértelmezésben a < használata.
Az Allocator
továbbra is a memóriaterület lefoglalásához használt memóriafoglaló.
Belső típusok
Itt csak azokat sorolom fel, amelyekről korábban még nem volt szó. (Ugyanazok a dolgai ennek megvannak, mint a vector
adatszerkezetnek.)
key_type, value_type
A sablonban használt elemtípus, a kettő ugyanaz.
key_compare, value_compare
A sablonban használt Compare
paraméter, a kettő ugyanaz.
Konstruktorai
public: explicit set(const Compare& comp = Compare(), const Allocator& = Allocator()); template <class InputIterator> set(InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator()); set(const set<Key,Compare,Allocator>& x);
A konstruktorai hasonlóak az eddig említett adatszerkezetek konstruktoraihoz. Így különösebb részletezésre nem szorul.
Destruktor
public: ~set();
Hívja az összes elem destruktorát és felszabadítja az elemeket.
Az = operátor
public: set<Key,Compare,Allocator>& operator=(const set<Key,Compare,Allocator>& x);
Felülírja az objektumot egy másik halmazzal.
Közös metódusok a többi adatszerkezettel
A következő metódusok ugyanúgy működnek, mint a többi adatszerkezet esetében:
Mivel ez az adatszerkezet rendezett, ezért a begin
metódus mindig a legkisebbre, az rbegin
pedig a legnagyobb elemre ad bejárót. Az bejárók konstans bejárók, nem módosítható rajtuk keresztül az elem.
insert – elem hozzáadása a halmazhoz
Elemet szúr be a halmazba.
public: pair<iterator,bool> insert(const value_type& x);
Beszúrja az adott értékű elemet a halmazba. Visszatér egy párral melynek az első eleme egy bejáró a beszúrt új elemre, vagy egy bejáró a már meglévő elemre, a pár második eleme egy logikai érték, ha igaz, akkor új elemet szúrtunk be, ha hamis, akkor már volt egy ilyen elem a halmazban korábban.
public: iterator insert(iterator ide, const value_type& x);
Beszúrja az elemet egy megadott elemet kiindulásul választva (ide
).
Természetesen mivel sorba van rendezve a halmaz, ezért nem ott fog kikötni, hanem a helyén.
Ha jól választjuk ki az elemet, akkor nagyon gyors beszúrást érhetünk el.
A visszatérési érték egy bejáró a beszúrt elemre, vagy a halmazban már meglévő elemre.
public: template <class InputIterator> void insert(InputIterator innen, InputIterator idaig);
A innen
és a idaig
bejárók által meghatározott félig nyitott tartományból
szúr be elemeket a halmazba.
erase – elemek törlése a halmazból
Elemeket töröl a halmazból
public: void erase(iterator ezt);
Törli a megadott bejáró által mutatott elemet.
public: size_type erase(const key_type& ertek);
Törli a megadott értékű elemeket, és visszatér a törölt elemek számával, amely
ezen set
típus esetén 1, ha benne volt; 0, ha nem.
public: void erase(iterator innen, iterator idaig);
Megadott innen
és idaig
bejáró által megadott félig nyílt tartományt törli a halmazból.
swap – két halmaz elemeinek a megcserélése
public: void swap(set<Key,Compare,Allocator>& ezzel);
Megcseréli az elemeket a másik halmazzal, az bejárók érvényesek maradnak.
key_comp – érték összehasonlító lekérdezése
public: key_compare key_comp() const;
Lekérdezi a objektum Compare
típusú összehasonlító objektumát.
A value_comp – érték összehasonlító lekérdezése
public: value_compare value_comp() const;
Lekérdezi a objektum Compare
típusú összehasonlító objektumát.
find – adott értékű elem keresése
public: iterator find(const key_type& x) const;
Megkeresi az adott értékű elemet, és visszatér az bejárójával, ha nincs meg, akkor
az end
metódus által visszaadott bejáróval tér vissza.
count – adott értékű elemek megszámolása
public: size_type count(const key_type& x) const;
Megszámolja az adott értékű elemeket. Ha megvan, akkor 1, különben 0. Nyilván multiset
esetén lehet 1-nél nagyobb érték is.
lower_bound – adott értékhez felülről legközelebb álló érték keresése
public: iterator lower_bound(const key_type& x) const;
Visszatér egy bejáróval a legkisebb elemre, melynek értéke nem kisebb, mint x
.
Ha nincs ilyen, akkor az end
bejáróval.
A multiset
esetén azonos elemek esetén az elsővel tér vissza.
A upper_bound
metódussal együtt használva azonos értékű elemek tartományát kaphatjuk meg.
upper_bound – adott értékhez felülről legközelebb álló, vele nem egyenlő érték keresése
public: iterator upper_bound(const key_type& x) const;
Visszatér egy bejáróval a legkisebb elemre, melynek értéke épp nagyobb, mint x
.
Ha nincs ilyen, akkor az end
bejáróval.
A lower_bound
metódussal együtt használva azonos értékű elemek tartományát kaphatjuk meg multiset
esetén.
equal_range – azonos értékű elemek tartományának keresése
public: pair<iterator,iterator> equal_range(const key_type& x) const;
Visszatér az azonos értékű elemek tartományával. A visszatérési érték
egy pár, melynek első eleme bejárója az elejére mutat; a második elemének
az bejárója az utolsó után mutat (félig nyitott tartomány). Ha nincs meg
az x
a halmazban, akkor a pár két bejárója megegyezik, és
egy x
közeli értékre mutat. A set
esetén ez a tartomány mindig 1 elemű, ha találat van.
A multiset
esetén hosszabb tartomány is lehet.
A multiset adatszerkezet
Ez teljesen ugyanolyan, mint a set
adatszerkezet, csak ez lehetővé teszi, hogy
több azonos elemet beletegyünk. Nyilván ezzel kapcsolatban pár metódus leírását is értelemszerűen
máshogy kell olvasni, pl.: equal_range
, count
.
A <set>
fejlécben van.
Pár különbség azért van a metódusokban is:
-
Más paraméterezésű az insert függvény:
iterator insert(const value_type& x);
Tehát ez nem bejáró-bool párral tér vissza, hanem simán bejáróval, mert azonos értékű elemek is lehetnek, így a második elem mindig igaz lenne.
A map adatszerkezet
Szintén a set
-hez hasonló adatszerkezet, csak ez nem csak értékeket tárol egy halmazban, hanem kulcs-érték párokat.
A kulcsok továbbra sem módosíthatók, viszont az értékek igen. A <map>
fejlécben található.
Műveleteinek időbonyolultsága
A kulcsokkal kapcsolatos műveletek ugyanolyan gyorsak, mint a set
esetében.
De ha értékekre akarunk keresni, vagy érték alapján törölni, ahhoz végig kell nyalni az egész adatszerkezetet (O(n)) időben.
Megadása
A következő négy paraméteres sablonnal lehet megadni:
public: template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key,T> > > class map;
Gyakorlatban csak az első két paraméter a fontos: a kulcstípus és az értéktípus.
Belső típusai
Ugyanazok a típusai megvannak, mint a set
típusnak, és a többi adatszerkezetnek. Néhány adattípusa viszont más:
- key_type
- A
key
sablonparaméter. - mapped_type
- A
T
sablonparaméter. - value_type
-
Egy pár, lényegében:
pair<Key, T>
. Fontos, hogy az adatszerkezet bejárói is ilyen párokra mutatnak.
Metódusai
Ugyanazok a metódusai vannak, mint set
adatszerkezetnek, csak
konkrét értékek helyett párokat lehet beszúrni (ld. value_type
).
Törölni pedig a kulcs alapján lehet (mivel az erase
függvény key_type
-t kér).
Viszont egyetlen extra dolog van, amivel ez az adatszerkezet többet tud a set
-nél, van [] operátora:
Az [] operátor
public: T& operator[](const key_type& x);
Ez megkeresi az adott értéket a kulcs alapján, és visszatér a rámutató referenciával. Ha nincs meg az elem, akkor létrehozza azt (annak a paraméter nélküli konstruktora alapján), és az újonnan létrehozott elem referenciájával tér vissza, ha megvan, akkor a meglévő elemével.
Ily módon ez az adatszerkezet úgy használható, mint egy tömb.
A multimap adatszerkezet
Ez olyan, mint a map
vagy a multiset
, csak több azonos kulcsú érték is lehet benne, valamint
ennek nincs [] operátora sem, mivel nem lehet egyértelműen azonosítani az értéket a kulcs alapján. Így az elemek (kulcs-érték párok) beszúrásának
is az egyetlen módja az insert
, elérésüknek, keresésünknek pedig a find
vagy az equal_range
.
Egyébként minden más ugyanúgy van, mint a map
-nál. A <map>
fejlécben van deklarálva.
A bitset adatszerkezet
Ez egy bitekből álló tömb adatszerkezet. Azaz egy olyan tömb, amely csak logikai értékeket tárol.
Viszont nem 1 egész byte-ot pazarol el egy értékre, hanem csak egy bitet, azaz 1 byte-on 8 értéket tárol.
Mellesleg a vector<bool>
is ilyen elven működik.
Megadása
A következő sablonnal adhatjuk meg, hogy hány elemű bithalmazt akarunk:
template <size_t N> class bitset;
Belső típusai
reference
class bitset::reference { friend class bitset; reference(); // Nem hozható létre csak úgy. public: ~reference(); operator bool () const; reference& operator=(bool x); reference& operator=(const reference& x); reference& flip(); bool operator~() const; };
Ez egy belső osztály. Mivel nincs adattípus, ami tárolni tudna 1 bitet. Ez úgy viselkedik, mintha 1 bit lenne.
Konvertálható bool
-lá, átbillenthető a másik bitbe, a flip
metódussal, és
lekérhető az ellentettje.
Konstruktorai
public: bitset();
Minden bitet 0-ra inicializál.
public: bitset(unsigned long val);
A megadott egész szám bitjeivel inicializálja a bittömb bitjeit.
public: template<class charT, class traits, class Allocator> explicit bitset ( const basic_string<charT,traits,Allocator>& str, typename basic_string<charT,traits,Allocator>::size_type pos = 0, typename basic_string<charT,traits,Allocator>::size_type n = basic_string<charT,traits,Allocator>::npos );
Egy bináris karakterlánc ('1' -es és '0'-ás karaktereket tartalmazó), alapján inicializálja a tömböt.
A második és a harmadik paramétere arról szól, hogy a karakterlánc mely részét kívánjuk felhasználni (kezdet, és onnan számolva a karakterek száma).
Alapértelmezésben az egész karakterláncot felhasználja. Ha nem odaillő karaktert talál, akkor invalid_argument
kivételt dob.
Operátorai
Tagfüggvényként:
public: bitset<N>& operator&= (const bitset<N>& rhs); bitset<N>& operator|= (const bitset<N>& rhs); bitset<N>& operator^= (const bitset<N>& rhs); bitset<N>& operator<<= (size_t pos); bitset<N>& operator>>= (size_t pos); bitset<N> operator~() const; bitset<N> operator<<(size_t pos) const; bitset<N> operator>>(size_t pos) const; bool operator== (const bitset<N>& rhs) const; bool operator!= (const bitset<N>& rhs) const;
Globális operátorok:
public: template<size_t N> bitset<N> operator& (const bitset<N>& lhs, const bitset<N>& rhs); template<size_t N> bitset<N> operator| (const bitset<N>& lhs, const bitset<N>& rhs); template<size_t N> bitset<N> operator^ (const bitset<N>& lhs, const bitset<N>& rhs);
Az IOStream-be való íráshoz globális operátorok
public: template<class charT, class traits, size_t N> basic_istream<charT, traits>& operator>> (basic_istream<charT,traits>& is, bitset<N>& rhs); template<class charT, class traits, size_t N> basic_ostream<charT, traits>& operator<< (basic_ostream<charT,traits>& os, bitset<N>& rhs);
Amint látható a bitműveletek ugyanúgy működnek, mint bármely más egész számon. Valamint van lehetőségünk az adatfolyamokba küldeni őket, vagy onnan beolvasni őket.
[] operátor – adott helyen álló bit lekérése
public: bool operator[](size_t pos) const; reference operator[](size_t pos);
Lekérdezi az adott pozíción lévő bitet. Nincs ellenőrizve az indexhatár.
set – adott helyen lévő bit 1-re állítása
public: bitset<N>& set(); bitset<N>& set(size_t pos, bool val = true);
Beállítja a biteket, az első változat minden bitet 1-esre állít, a második változat egy adott helyen lévő bitet állítja be. Visszatérési értéke a egy referencia az objektumra magára.
reset – adott helyen lévő bit 0-ra állítása
public: bitset<N>& reset(); bitset<N>& reset(size_t pos);
Biteket nulláz, a paraméter nélküli változata, az összes bitet nullázza. A második egy megadott bitet nulláz le.
flip – adott helyen álló bit átfordítása
public: bitset<N>& flip(); bitset<N>& flip(size_t pos);
Biteket fordít át, a paraméter nélküli változata minden bitet átfordít, a paraméteres egy megadott helyen lévő bitet.
to_unlong – unsigned longgá való átalakítás
public: unsigned long to_ulong() const;
A bitekből összeállítható unsigned long értékkel tér vissza.
to_string – karakterlánccá alakítás
public: template <class charT, class traits, class Allocator> basic_string<charT,traits,Allocator> to_string() const;
Egyesekből és nullákból álló karakterlánccá alakítja a biteket.
count – egyesen álló bitek számának a lekérése
public: size_t count();
Visszatér az egyesen álló bitek számával.
size – bitek száma (tulajdonképpen az N sablonparaméter)
public: size_t size() const;
Visszatér a bitek számával a halmazban. Ez tulajdonképpen az N
sablonparaméter.
test – 1-es-e a megadott helyen álló bit?
public: bool test(size_t pos) const;
Megadott helyen pozíción lévő bit értékét kérdezi le. Végez indexhatár ellenőrzést is.
Ha nincs kívül esik az index, akkor out_of_range
kivételt dob.
any – van-e egyes bit beállítva
public: bool any() const;
Igazzal tér vissza legalább 1 bit be van állítva 1-re.
none – minden bit nulla?
public: bool none() const;
Igazzal tér vissza, ha minden bit 0.
Adatszerkezet adapterek
Ezek nem adatszerkezetek, hanem valamilyen adatszerkezetet tárolnak, hogy aztán veremként, sorként vagy fontossági sorként használjuk őket. Ebben a részben ismertetem ezeket.
A stack adapter
Ez egy vermet valósít meg, tehát amit utoljára betettünk azt vesszük ki először.
Megadása
public: template <class T, class Container = deque<T> > class stack;
Alapértelmezett adatszerkezet, amit ez használ a deque
, bármilyen adatszerkezet megteszi, amelynek van
size
, back
,
push_back
és pop_back
metódusa.
Belső típusai
size_type
Egy pozitív egész típus, valószínűleg size_t
value_type
A T
sablon paraméter.
Konstruktora
public: explicit stack(const Container& ctnr = Container());
Inicializálja a vermet egy adott adatszerkezettel, vagy üresen.
empty – üres-e?
public: bool empty() const;
Igazzal tér vissza, ha a verem üres.
size – mennyi elem van benne?
public: size_type size() const;
Visszatér a veremben lévő elemek számával.
top – legfelső elem lekérése
public: value_type& top(); const value_type& top() const;
Visszatér egy referenciával a verem tetején lévő elemre. Ha üres a verem, akkor egy érvénytelen referenciával tér vissza, ezért érdemes megnézni, hogy a verem üres-e.
push – elem behelyezése
public: void push(const T& x);
Betesz egy elemet a verembe.
pop – elem kivétele
public: void pop();
Leveszi a verem tetején lévő elemet. Üres verem esetén hívva nincs specifikálva, hogy mi fog történni, (szóval ellenőrizzünk hogy üres-e.)
A queue adapter
Ez egy sor adatszerkezetet valósít meg, azaz, az vehetjük ki először, ami először betettünk.
Megadása
template < class T, class Container = deque<T> > class queue;
Hasonlóképpen van megadva, mint a stack
esetében.
Bármilyen adatszerkezet megfelel, amelynek van size
, front
,
back
, push_back
és push_front
metódusa.
Konstruktor
public: explicit queue(const Container& ctnr = Container());
Inicializálja az adapter egy üres adatszerkezettel vagy a paraméterként megadottal.
Közös metódusok
Ezek ugyanúgy működnek, mint a stack
esetében:
front – elején lévő elem lekérése
public: value_type& front(); const value_type& front() const;
Visszatér a soron következő elemre mutató referenciával. Üres sor esetén érvénytelen lesz a referencia.
back – végén lévő elem lekérése
public: value_type& back(); const value_type& back() const;
Visszatér a legutóbb berakott elemre mutató referenciával. Üres sor esetén érvénytelen lesz a referencia.
push – elem berakása a sor végén
public: void push(const T& x);
Elemet tesz a sorba.
pop – elem levétele a sor elejéről
public: void pop();
Kiveszi a legrégebben berakott elemet.
A priority_queue adapter
Ez egy fontossági sorrend adapter, azaz egy olyan sor, ahol mindig a legmagasabb értékű elem van az elején.
Megadása
template < class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;
Alapértelmezésben szüksége van egy elemtípusra, de megadható, hogy milyen adatszerkezetet használjon, illetve, hogy milyen módon hasonlítsa össze a dolgokat.
Bármilyen adatszerkezet megteszi, amelynek van front
, push_back
, pop_back
és size metódusa
,
valamint az bejárói tetszőleges elérésűek.
Konstruktorai
public: explicit priority_queue ( const Compare& x = Compare(), const Container& y = Container() );
Inicializálja az adaptert, és a benne lévő adatszerkezetet, és összehasonlítót.
public: template <class InputIterator> priority_queue ( InputIterator first, InputIterator last, const Compare& x = Compare(), const Container& y = Container() );
Inicializálja az adaptert, két bejáró által meghatározott félig nyílt tartomány alapján.
Közös metódusok a többi adapterrel
Ezekkel lehet megnézni, hogy hány elem van benne, és hogy üres-e.
top – a sor elején álló (legnagyobb) elem.
public: const value_type& top() const;
Lekérdezi a sor elején álló (legnagyobb) elemet. Mivel konstans referenciával tér vissza, így az az elem nem módosítható.
pop – a sor elején álló elem levétele
public: void pop();
Kiveszi a legnagyobb értékű elemet.
push – elem behelyezése a fontossági sorba
public: void push(const T& x);
Beleteszi az elemet a fontossági sorba (átrendezve azt).
A karakterlánc függvénytár
Ez a függvénytár, amint a nevéből is látszik karakterláncok kezelésére való.
A string osztály tagjai
Ez az osztály egy karakterláncot reprezentál.
Nagyban hasonlít a korábban bemutatott STL tároló osztályokra elsősorban a vector
osztályra.
Bejárói tetszőleges hozzáférésűek. Az osztály a <string>
fejlécben van.
Konstruktorai
public: string();
Egy üres karakterláncot inicializál.
public: string(const string& ebbol);
Másoló konstruktor.
public: string(const string& ebbol, size_t innen, size_t ennyit = npos);
Inicializálja az objektumot egy másik karakterláncból kivágott darabbal. A innen
az első karakter, ahol
kezdődik, majd onnét számolva legfeljebb ennyit
darab karaktert vesz. Ha karakterlánc vége hamarabb jön,
akkor kevesebbet. (Az npos
egy konstans, mely egy nagy számot jelent, így alapértelmezés az,
hogy a megadott pozíciótól a karakterlánc végéig számító darabot vágja ki.)
public: string(const char *s, size_t n);
Karaktertömb első n
eleme alapján inicializálja az objektumot.
public: string(const char *s);
C karakterlánc (nullás byte-tal lezárt karakterlánc) alapján inicializálja az objektumot.
public: string(size_t n, char c);
A karakterláncot n
db c
karakterből álló szöveggel inicializálja.
template<class InputIterator> string(InputIterator begin, InputIterator end);
Két bejáró alapján meghatározott félig nyitott tartomány alapján inicializálja a karakterláncot.
= operátor
public: string& operator=(const string& str); string& operator=(const char* s); string& operator=(char c);
Az értékadó operátornak különféle változatai létetnek. Ennek az objektumnak adhatunk értéket, másik karakterláncból, hagyományos C karakterláncból, illetve beállíthatjuk, hogy egyetlen egy karaktert tartalmazzon.
Tárolóosztályokkal közös metódusok
A következő metódusok úgy működnek, mint az STL tárolóosztályok esetében:
- begin
- end
- rbegin
- rend
- size
- max_size
- resize
- capacity
- reserve
- clear
- empty
- [] operátor
- at
- push_back
- swap
- get_allocator
length – karakterlánc hossza.
public: size_t length() const;
Ugyanaz, mint a size
metódus, visszatér a karakterlánc hosszával.
+= operátor – hozzáfűzés a karakterlánchoz
public: string& operator+=(const string& str); string& operator+=(const char* s); string& operator+=(char c);
Karakterláncot fűz hozzá az objektumhoz, értelemszerűen hozzá tud fűzni egy karaktert, C karakterláncot és egy másik string
objektum tartalmát.
append – hozzáfűzés a karakterlánchoz
Hozzáfűz az aktuális karakterlánchoz.
public: string& append(const string& str);
Egy másik karakterlánc tartalmát fűzi hozzá.
public: string& append(const string& str, size_t innen, size_t ennyit);
A megadott karakterlánc egy részét fűzi hozzá (innen
-től kezdve, ennyit
darab karaktert max).
Ha a innen
a karakterláncon kívül van, akkor out_of_range
kivételt dob.
public: string& append(const char* s, size_t n);
Megadott C karakterlánc első n
karakterét fűzi hozzá.
public: string& append(const char* s);
Megadott teljes C karakterláncot fűzi hozzá (C karakterláncok egy nullás byte-tal vannak lezárva.)
public: template <class InputIterator> string& append(InputIterator first, InputIterator last);
Adott bejárók által meghatározott félig nyitott tartományban lévő karaktereket fűzi hozzá.
A függvények visszatérési értéke a karakterlánc maga.
assign – értékadás
Lecseréli a karakterlánc korábbi értékét egy újjal. Tulajdonképpen egy az = operátor metódusos változata.
public: string& assign(const string& str);
Egy másik karakterlánccal cseréli le a tartalmat.
public: string& assign(const string& str, size_t innen, size_t ennyit);
Egy másik karakterlánc részével cseréli le a részkarakterlánc innen
pozícióban kezdődik, és
onnan számítva legfeljebb ennyit
karaktert vesz át.
public: string& assign(const char* s, size_t n);
Megadott C string első n
karakterével cseréli le.
public: string& assign(const char* s);
Megadott C karakterlánccal értékével cseréli le a tartalmat.
public: string& assign(size_t n, char c);
n
darab c
karakterrel cseréli le a tartalmat.
public: template <class InputIterator> string& assign(InputIterator first, InputIterator last);
Adott bejárók által meghatározott félig nyitott tartomány alapján cseréli le a tartalmat.
A függvények visszatérési értéke a karakterlánc maga.
insert – karakterlánc beszúrása az aktuális objektumba
public: string& insert(size_t pos, const string& str); //Egész karakterláncot string& insert(size_t pos, const string& str, size_t start, size_t n); //Rész karakterláncot string& insert(size_t pos, const char* s, size_t n); //C karakterlánc elejét string& insert(size_t pos, const char* s); //C karakterláncot string& insert(size_t pos, size_t n, char c); //n darab c karaktert iterator insert(iterator p, char c); //Egyetlen karaktert void insert(iterator p, size_t n, char c); //n darab c karaktert template<class InputIterator> void insert(iterator p, InputIterator first, InputIterator last); //Félig nyitott tartomány által meghatározott karakterláncot.
Karakterláncot szúr be az aktuális objektumba, adott helyen lévő karakter elé. Ezt a helyet megadhatjuk pozícióval vagy bejáróval. Nem részletezem ismét, hogy a különféle overloadok paramétereit hogyan kell értelmezni, megtettem már az előző két függvényben.
A visszatérési érték az objektum maga, vagy egy bejáró a beszúrási pozícióra.
erase – részkarakterlánc törlése
Töröl a karakterláncból.
public: string& erase(size_t pos = 0, size_t n = npos);
Adott pozíciótól kezdve n karaktert töröl a karakterláncból. Alapértelmezésben a nullázza.
public: iterator erase(iterator position);
Egyetlen karaktert töröl az bejárónál
public: iterator erase(iterator first, iterator last);
Bejárók által meghatározott félig nyitott tartományt töröl a karakterláncból.
replace – a karakterlánc egy részét vagy egészét cseréli le
public: string& replace(size_t pos1, size_t n1, const string& str); //egész karakterlánc objektum tartalmával string& replace(iterator i1, iterator i2, const string& str); string& replace(size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2); //rész karakterlánccal string& replace(size_t pos1, size_t n1, const char* s, size_t n2); //C karakterlánc elejével string& replace(iterator i1, iterator i2, const char* s, size_t n2); string& replace(size_t pos1, size_t n1, const char* s); //Egész C karakterlánccal string& replace(iterator i1, iterator i2, const char* s); string& replace(size_t pos1, size_t n1, size_t n2, char c); //ismétlődő karaktersorozattal string& replace(iterator i1, iterator i2, size_t n2, char c); template<class InputIterator> string& replace(iterator i1, iterator i2, InputIterator j1, InputIterator j2); //félig nyitott tartománnyal.
Karakterlánc egy részét cseréli le egy másikkal. A lecserélendő rész megadható kezdő pozícióval post1
és hosszal n1
vagy
bejárókkal megadott félig nyílt tartományokkal (i1
és i2
). A helyére beszúrandó karakterláncot pedig a korábban említett sokféle
módon lehet megadni.
c_str – C karakterlánc kinyerése
public: const char* c_str() const;
Visszatér a C karakterlánc tartalmával a C++ karakterláncnak. A mutató a következő módosító karakterlánc műveletig vagy az objektum megsemmisüléséig érvényes.
data – tárolt bináris adattal való visszatérés
public: const char* data() const;
Visszatér a karakterláncban tárolt adattal, a c_str
-rel ellentétben ez nem tesz a karakterlánc végére 0-ás byte-ot, így az adat nem használható
C karakterláncként.
copy – C tömbbe való másolás karakterláncból
public: size_t copy(char* s, size_t n, size_t pos = 0) const;
Kimásol legfeljebb n
darab karaktert a pos
helyről kezdve az s
által mutatott helyre. Visszatérési értéke a másolt karakterek száma, mely lehet n
vagy kevesebb, ha kevesebb karakter volt a karakterlánc végéig.
find – keresés karakterláncban
public: size_t find(const string& str, size_t pos = 0) const; size_t find(const char* s, size_t pos, size_t n) const; size_t find(const char* s, size_t pos = 0) const; size_t find(char c, size_t pos = 0) const;
Megkeresi a megadott karakterlánc első előfordulási helyét, adott pozíciótól, az aktuális objektumban. A keresés a pos
pozíciótól kezdődik.
A keresendő karakterláncot sokféleképpen lehet megadni. Lehet egy másik karakterlánc objektum (str
),
egy C karakterlánc (s
), vagy annak az első n
karaktere. De lehet egyetlen egy
karakter is, amit keresünk (c
).
A megvan a keresendő karakterlánc, akkor visszatér azzal a pozícióval, ahol kezdődik, különben npos
konstans értékével (ami egy nagy szám).
rfind – keresés a karakterlánc végétől visszafelé
public: size_t rfind(const string& str, size_t pos = npos) const; size_t rfind(const char* s, size_t pos, size_t n) const; size_t rfind(const char* s, size_t pos = npos) const; size_t rfind(char c, size_t pos = npos) const;
Ugyanaz, mint a find
csak ez visszafelé keres, tehát a megadott pozíciótól visszafelé számolva az utolsó találatot keresi meg.
find_first_of – adott karakterlánc karaktereinek a keresése
public: size_t find_first_of(const string& str, size_t pos = 0) const; size_t find_first_of(const char* s, size_t pos, size_t n) const; size_t find_first_of(const char* s, size_t pos = 0) const; size_t find_first_of(char c, size_t pos = 0) const;
Adott karakterlánc bármely karakterének első előfordulását keresti az aktuális objektumban, pos
pozíciótól kezdve.
Visszatér a hellyel ahol az első karaktert megtalálta, különben az npos
értékével tér vissza.
A paraméterek értelmezését a find
metódusnál írtam le.
find_last_of – adott karakterlánc karaktereinek a keresése visszafelé
public: size_t find_last_of(const string& str, size_t pos = npos) const; size_t find_last_of(const char* s, size_t pos, size_t n) const; size_t find_last_of(const char* s, size_t pos = npos) const; size_t find_last_of(char c, size_t pos = npos) const;
Ugyanaz, mint a find_first_of
csak ez az adott pozíciótól visszafelé keres.
find_first_not_of – adott karakterlánc karaktereitől különböző karakterek keresése
public: size_t find_first_not_of(const string& str, size_t pos = 0) const; size_t find_first_not_of(const char* s, size_t pos, size_t n) const; size_t find_first_not_of(const char* s, size_t pos = 0) const; size_t find_first_not_of(char c, size_t pos = 0) const;
A find_first_of
logikai ellentéte: visszatér az első pozícióval, melyen lévő karakter
nem egyezik meg a karakterláncban lévőkkel.
find_last_not_of – adott karakterlánc karaktereitől különböző karakterek keresése hátulról
public: size_t find_last_not_of(const string& str, size_t pos = npos) const; size_t find_last_not_of(const char* s, size_t pos, size_t n) const; size_t find_last_not_of(const char* s, size_t pos = npos) const; size_t find_last_not_of(char c, size_t pos = npos) const;
A find_last_of
logikai ellentéte: visszatér az első pozícióval, melyen lévő karakter
nem egyezik meg a karakterláncban lévőkkel.
substr – részkarakterlánc képzése
public: string substr(size_t pos = 0, size_t n = npos) const;
A karakterlánc egy részéből képez egy új karakterláncot, a rész a pos
helyen kezdődik, legfeljebb n
karakterből áll (vagy kevesebből, ha karakterlánc vége előbb jön).
Ha a pos
a karakterláncon kívülre mutat, akkor out_of_range
kivételt dob.
compare – két karakterlánc összehasonlítása
public: int compare(const string& str) const; int compare(const char* s) const; int compare(size_t pos1, size_t n1, const string& str) const; int compare(size_t pos1, size_t n1, const char* s) const; int compare(size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2) const; int compare(size_t pos1, size_t n1, const char* s, size_t n2) const
Összehasonlítja az aktuális objektum karakterláncot (vagy annak részét) egy másik karakterlánccal.
Az első kettő egy másik karakterlánc objektummal vagy C karakterlánccal hasonlítja össze az objektumot.
A többi a pos1
és n1
által kijelölt részkarakterláncot hasonlítja össze
a megadott másik karakterlánc
objektummal vagy annak pos2
és n2
által kijelölt részével,
vagy egy C karakterlánccal, vagy annak első n2
karakterével. Ha pos1
vagy pos2
az adott karakterláncok kívül mutat, a metódus out_of_range
kivételt dob.
Visszatérési értéke 0, ha az összehasonlított karaktersorozatok megegyeznek; negatív érték, ha az aktuális objektumban lévő karaktersorozat a betűrendben előbb van; pozitív értéket, hogy ha hátrébb.
A char_traits sablon
Ez egy sablon, mellyel karakterjellemzőket lehet megadni. Ezt a string
és más osztályok használhatják a műveleteikhez.
Sablonspecializációval készíthetünk saját karakterjellemzőt bármilyen típushoz.
Megadása
A következő sablon adja meg:
template <class charT> struct char_traits;
Előredefiniált specializációi
A char
és wchar_t
típusra alapból létezik specializáció, ezeket használja sok objektum:
template <> struct char_traits<char> template <> struct char_traits<wchar_t>
Belső típusai
char_type
Ez a CharT
sablonparaméter. A két specializációban egy char
, illetve wchar_t
.
int_type
Egy olyan típus, melynek értékkészlete tartalmazza a teljes char_type
értékkészletét
és még az EOF karaktert. A két specializációban ez int
, illetve wint_t
.
off_type
Az eltolás adattípus, olyan mint a streamoff
az iostream
típus esetén.
A két specializáció esetén ez a streamoff
.
pos_type
Pozíció adattípus, olyan mint a streampos
az iostream
típus esetén.
A két specializáció esetén ez a típus a streampos
.
state_type
Egy állapot típus, karakter konverzió állapotához. A két specializáció esetén mbstate_t
.
Szükséges metódusok
A következő részben sorolom fel, hogy egy char_traits
specializációnak milyen metódusokat kell tartalmaznia.
assign – értékadás
static void assign(char_type& c1, char_type& c2);
Értékadás művelete: c1=c2
.
eq – egyenlőség
static bool eq(const char_type& c1, const char_type& c2);
Egyenlőség művelete: c1 == c2
lt – kisebb-e
static bool lt(const char_type& c1, const char_type& c2);
Összehasonlítás művelete: c1 < c2
compare – karakterlánc-összehasonlítás
static int compare(const char_type* s1, const char_type* s2, size_t n);
karakterlánc-összehasonlítás, az strncmp
-vel analóg.
length – karakterlánchossz
static size_t length(const char_type* s);
Karakterlánchossz, az strlen
függvénnyel analóg.
find – karakterkeresés karakterláncban
static const char_type* find(const char_type* s, size_t n, const char_type& a);
Az a
karakter keresése az s
karakterlánc első n
karakterében. Visszatérési érték egy mutató az első találat helyére.
move – részkarakterlánc mozgatása
static char_type* move(char_type* s1, const char_type* s2, size_t n);
n
karakter mozgatása s2
helyről s1
helyre.
A memmove
függvénnyel analóg.
copy – részkarakterlánc másolása
static char_type* copy(char_type* s1, const char_type* s2, size_t n);
n
karakter másolása s2
helyről s1
helyre.
A memcpy
függvénnyel analóg.
assign – tömb feltöltése adott karakterrel
static char_type* assign(char_type* s, size_t n, char_type a);
s
által mutatott területre, n
darab a
karakter másolása.
Visszatérési értéke s
. A memset
függvénnyel analóg.
eof – a fájlvég jel értéke
static int_type eof();
A fájlvég jelnek használt érték. A két specializáció esetén EOF
(valami negatív szám).
not_eof – fájlvég-e a karakter
static int_type not_eof(const int_type& c);
Visszatér c
-vel, ha az nem az eof, különben valami más nem-eof értékkel.
to_char_type – egészből karakterré konvertál
static char_type to_char_type(const int_type& c);
char_type
-pá konvertálja, ha megadott int_type
értéket, ha lehet.
Ha nem lehet, akkor a visszatérési érték nincs specifikálva (azaz bármi lehet).
to_int_type – karakterből intté konvertál
static int_type to_int_type(const char_type& c);
int_type
-pá konvertálja a megadott char_type-ot.
eq_int_type – két egész számot hasonlít össze
static bool eq_int_type(const int_type& c1, const int_type& c2);
Igazzal tér vissza, hogy ha c1 és c2 értékét megkaphatjuk a to_int_type
függvény értékeként,
és ha mindkettő értéke az eof()
függvény által visszaadott érték, különben hamissal.
Globális operátorok és függvények
A függvénytár definiál globális függvényeket és operátorokat a karakterláncokhoz
A + operátor – karakterláncok összefűzése
string operator+(const string& lhs, const string& rhs); string operator+(const char* lhs, const string& rhs); string operator+(char lhs, const string& rhs); string operator+(const string& lhs, const char* rhs); string operator+(const string& lhs, char rhs);
Ezzel lehet string
objektumokat összeadni, illetve hozzájuk adni C karakterláncot vagy karakter. Az eredmény a kettő összefűzöttje lesz.
Összehasonlító operátorok
bool operator==(const string& lhs, const string& rhs); bool operator==(const char* lhs, const string& rhs); bool operator==(const string& lhs, const char* rhs); bool operator!=(const string& lhs, const string& rhs); bool operator!=(const char* lhs, const string& rhs); bool operator!=(const string& lhs, const char* rhs); bool operator<(const string& lhs, const string& rhs); bool operator<(const char* lhs, const string& rhs); bool operator<(const string& lhs, const char* rhs); bool operator>(const string& lhs, const string& rhs); bool operator>(const char* lhs, const string& rhs); bool operator>(const string& lhs, const char* rhs); bool operator<=(const string& lhs, const string& rhs); bool operator<=(const char* lhs, const string& rhs); bool operator<=(const string& lhs, const char* rhs); bool operator>=(const string& lhs, const string& rhs); bool operator>=(const char* lhs, const string& rhs); bool operator>=(const string& lhs, const char* rhs);
Ezek az összehasonlító operátorok betűrendi összehasonlítást végeznek (az angol ábécé, illetve az ASCII kódtábla szerint).
A << és >> operátor – karakterlánc objektumok adatfolyamba íratása
ostream& operator<<(ostream& os, const string& str); istream& operator>>(istream& is, string& str);
Ezeket az operátorok azért vannak, hogy a karakterláncot be lehessen szúrni adatfolyamokba vagy beolvasni onnan.
swap függvény – két karakterlánc tartalmának felcserélése
void swap(string& lhs, string& rhs);
Felcseréli a két karakterlánc tartalmát.
getline függvény – getline metódus karakterlánc beolvasására adatfolyamból
istream& getline(istream& is, string& str, char delim); istream& getline(istream& is, string& str);
Adott input adatfolyamból (is
) beolvas egy sort és eltárolja az str
karakterláncba.
Az alapértelmezett elválasztó a '\n'
karakter, de ha megadjuk a delim
paramétert, akkor
más is lehet. Az elválasztó is be lesz olvasva, de nem lesz része a karakterláncnak.
Algoritmus függvénytár
Ebben a részben az STL algoritmusairól lesz szó, ezek függvénysablonok. Melyek paraméterezhetők mindenféle függvénnyel. Általában adatszerkezeteken, bejárókkal, félig nyílt tartományokon működnek. Az egyszerűbbeket a rövid kódjukkal együtt közlöm az összetettekről csak leírást adok.
Sablonparaméterek
Ezek az algoritmus függvények csupán függvény sablonok, a paramétereik a következő típusokat jelentik:
- InputIterator
- Egy bemeneti bejáró
- OutputIterator
- Egy kimeneti bejáró
- BidirectionalIterator
- Egy kétirányú bejáró típus
- ForwardIterator
- Egyirányú bejáró típus
- RandomAccessIterator
- Egy közvetlen elérésű bejáró.
- UnaryOperator
-
Egy függvénymutató-típus, lényegében valami ilyesmi:
OutputIterator::value_type (*UnaryOperator)(const InputIterator::reference x)
. Az bejáró típusok általában adottak sablonparaméterként. Nem muszáj, hogy függvénytípus legyen, lehet objektum is, amely az () operátort írja felül. - BinaryOperator
-
Egy függvénymutató-típus, lényegében valami ilyesmi:
OutputIterator::value_type (*BinaryOperator)(const InputIterator1::reference x, const InputIterator::reference y)
. Az bejáró típusok általában adottak sablonparaméterként. Nem muszáj, hogy függvénytípus legyen, lehet objektum is, amely az () operátort írja felül. - Predicate
-
Egy függvénymutató-típus, lényegében a következő:
bool (*Predicate)(const InputIterator::reference x)
. Ennek a függvénynek igazat kell visszaadnia, hogy ha a paramétere valamilyen tulajdonságokkal rendelkezik. Természetesen lehet objektum is, amely egy felülbírált () operátorral rendelkezik. - BinaryPredicate
-
Egy függvénymutató-típus, lényegében a következő:
bool (*BinaryPredicate)(const InputIterator1::reference a, const InputInterator2::reference b)
. Ennek a függvénynek igazat kell visszaadnia, hogy ha a két paramétere egyenlőnek tekintendő. Természetesen lehet objektumtípus is, amely egy felülbírált () operátorral rendelkezik. - RandomNumberGenerator
-
Véletlenszám-generátor függvény, lényegében a következő:
iterator_traits<RandomAccessIterator>::difference_type (*RandomNumberGenerator)(iterator_traits<RandomAccessIterator>::difference_type dt);
Ez a függvény 0 és megadottdt
között generál véletlen számot. Természetesen lehet objektumtípus is, amely egy felülbírált () operátorral rendelkezik. - Generator
- Egy tetszőleges paraméter nélküli függvény, amely a művelethez megfelelő típusú értékkel tér vissza. Természetesen lehet objektumtípus is, amely egy felülbírált () operátorral rendelkezik.
- Compare
-
Komparátor függvény, lényegében a következő:
bool (*Compare)(iterator_traits<RandomAccessIterator>::difference_type p1, iterator_traits<RandomAccessIterator>::difference_type p2);
. Igazat ad, ha az első argumentuma kisebb, mint a második, különben hamisat.
Nem módosító algoritmusok
Ezek az algoritmusok nem módosítják az adatszerkezetet, amelyen elindítottuk őket.
for_each – adott lista minden elemén elvégzi a megadott műveletet
template<class InputIterator, class Function> Function for_each(InputIterator eleje, InputIterator vege, Function f) { for (; eleje!=vege; ++eleje) { f(*eleje); } return f; }
Végigmegy a két bejáró által meghatározott félig nyílt tartományban, és minden elemre meghívja az f
függvényt, visszatérési értéke az f
függvény.
Az f
függvény egy egyparaméteres függvény, amely az bejáró által mutatott típusú adatra mutat.
O(n) időbonyolultságú.
find – érték keresése
template<class InputIterator, class T> InputIterator find(InputIterator eleje, InputIterator vege, const T& ertek) { for (; eleje!=vege; eleje++) { if (*eleje==ertek) break; } return eleje; }
Az bejárók által meghatározott félig nyílt tartományban megkeresi a megadott értéket. Ha megtalálta, akkor visszatér az bejáróval rá, ha nem, akkor a vege
bejáróval tér vissza.
O(n) időbonyolultságú.
find_if – keresés feltétel alapján
template<class InputIterator, class Predicate> InputIterator find_if(InputIterator eleje, InputIterator vege, Predicate feltetel) { for (; eleje!=vege; eleje++) { if (feltetel(*eleje)) break; } return eleje; }
Megkeresi a megadott tulajdonságú elemet az bejárók által meghatározott tartományban.
A feltetel
olyan függvény, amely bool
értékkel tér vissza, és az bejárók által mutatott típusú adatot fogad el paraméterként.
A függvény találat esetén visszatér a találatra mutató bejáróval, különben a vege
paraméter értékével tér vissza.
O(n) időbonyolultságú.
find_end – egyik lista utolsó előfordulásának megkeresése a másikban
template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_end ( ForwardIterator1 eleje1, ForwardIterator1 vege1, ForwardIterator2 eleje2, ForwardIterator2 vege2 ); template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 find_end ( ForwardIterator1 eleje1, ForwardIterator1 vege1, ForwardIterator2 eleje2, ForwardIterator2 vege2, BinaryPredicate feltetel );
Megkeresi a eleje1
és vege1
által meghatározott félig nyilt
tartományban megkeresi a eleje2
és vege2
félig nyílt tartomány elemeit (ebben a sorrendben).
Visszatér az bejáróval az utolsó előfordulásának a kezdetére, ha nincs meg, akkor a last1
bejáróval tér vissza.
Pl.: [1 2 3 4 1 2 3 1 2 3 4 5] tartományban az [1 2 3] keresésekor az bejáró 8. elemre mutat.
A feltetel
egy függvény, mely bool
értékkel tér vissza, két paramétere van, típusuk az egyik
és másik bejáró által mutatott dolog típusa. Visszatérési értéke igaz, ha a kettő érték egyezőnek tekinthető.
A 3. paraméter nélküli változatnál egyszerűen az == operátort használja.
O(mn) időbonyolultságú.
find_first_of – adott elemek közül az első megkeresése a listában
template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_first_of ( ForwardIterator1 eleje1, ForwardIterator1 vege1, ForwardIterator2 eleje2, ForwardIterator2 vege2 ); template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 find_first_of ( ForwardIterator1 eleje1, ForwardIterator1 vege1, ForwardIterator2 eleje2, ForwardIterator2 vege2, BinaryPredicate feltetel );
A eleje1
és vege1
kijelöl egy félig nyitott tartományt, melyben keresünk.
A eleje2
és a vege2
bejárókkal jelölt félig nyílt tartomány egy
halmazt határoz meg, melynek elemeit megkeressük az előbbiben. A függvény visszatér egy bejáróval
az első elemre a tartományban, amely benne van a megadott halmazban. Ha nincs ilyen elem, akkor a vege1
bejáróval tér vissza.
A feltetel
itt is egy függvény, amely bool
típusú értéket ad vissza, amely
igaz, ha a két paraméterében megadott érték egyezőnek tekintendő, a paraméterek típusa az bejárók típusának megfelelő típus.
A predikátum nélküli változatok esetén == operátort használja.
O(n) időbonyolultságú.
adjacent_find – azonos értékű elemek megkeresése
template <class ForwardIterator> ForwardIterator adjacent_find ( ForwardIterator eleje, ForwardIterator vege ); template <class ForwardIterator, class BinaryPredicate> ForwardIterator adjacent_find ( ForwardIterator eleje, ForwardIterator vege, BinaryPredicate pred );
Két egymás melletti azonos értékű elemet keres meg a tartományban. Az összehasonlítás a megadott == operátorral illetve predikátummal történik.
Visszatér egy bejáróval az azonos értékű elempár első elemére, ha nincs ilyen, akkor a eleje
bejáróval tér vissza.
count – megszámolja az adott értékű elemeket a megadott listában
template <class InputIterator, class T> typename iterator_traits<InputIterator>::difference_type count(ForwardIterator eleje, ForwardIterator vege, const T& ertek);
Megszámolja a megadott tartományban az adott értékű elemeket. Az iterator_traits<T>::difference_type
a csúnya neve ellenére egy egész szám.
O(n) időbonyolultságú.
count_if – adott feltételnek megfelelő elemek megszámolása
template <class InputIterator, class Predicate> typename iterator_traits<InputIterator>::difference_type count_if(ForwardIterator eleje, ForwardIterator vege, Predicate feltetel);
A megadott tartományban megszámolja azokat az elemeket, amelyekre a feltetel
függvény igazat ad vissza.
O(n) időbonyolultságú.
mismatch – a különbség helyének a megkeresése
template <class InputIterator1, class InputIterator2> pair<InputIterator1, InputIterator2> mismatch ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2 ); template <class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2> mismatch ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, BinaryPredicate feltetel );
Két félig nyílt tartományt hasonlít össze, az elsőt a eleje1
, vege1
jelzi,
a eleje2
a másik tartomány kezdetét jelzi, a vége nincs megadva, mert feltételezi, hogy azonos hosszúságúak.
Megadható egy predikátum is az összehasonlításhoz feltetel
, alapértelmezésben az == operátort használja.
Visszatér két bejáróval a különböző elempárra, ha megegyezik a két tartomány, akkor pár első-első eleme a vege1
bejáró lesz.
O(n) időbonyolultságú.
equal – összehasonlít két listát
template <class InputIterator1, class InputIterator2> bool equal ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2 ); template <class InputIterator1, class InputIterator2, class BinaryPredicate> bool equal ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, BinaryPredicate feltetel );
Két félig nyílt tartományt hasonlít össze. A paraméterezés ugyanaz, mint előbb. Visszatérési értéke igaz, ha a két tartomány megegyezik, hamis, ha nem.
O(n) időbonyolultságú.
search – egyik lista megkeresése a másik listában
template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 search ( ForwardIterator1 eleje1, ForwardIterator1 vege1, ForwardIterator2 eleje2, ForwardIterator2 vege2 ); template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> ForwardIterator1 search ( ForwardIterator1 eleje1, ForwardIterator1 vege1, ForwardIterator2 eleje2, ForwardIterator2 vege2. BinaryPredicate feltetel );
A eleje1
és vege1
bejárók által kijelölt félig nyílt tartományban keresi
a másik eleje2
és vege2
által kijelölt félig nyílt tartomány első előfordulását.
Ha megtalálta, akkor visszatér egy bejáróval az első illeszkedő elemre, különben a vege1
bejáróval tér vissza.
Megadott predikátummal vagy az == operátorral végzi az összehasonlítást.
Úgy működik, mint a find_end
csak ez az első illeszkedő tartományt keresi meg.
O(n) időbonyolultságú.
search_n – n egymás mellett lévő elem megkeresése
template <class ForwardIterator, class Size, class T> ForwardIterator search_n ( ForwardIterator eleje, ForwardIterator vege, Size ennyit, const T& ertek ); template <class ForwardIterator, class Size, class T, class BinaryPredicate> ForwardIterator search_n ( ForwardIterator eleje, ForwardIterator vege, Size ennyit, const T& ertek, BinaryPredicate feltetel );
A megadott tartományban (eleje
..vege
) keres ennyit
darab egymás mellett lévő ertek
értéket.
Visszatér egy bejáróval a szekvencia első elemére, vagy a vege
bejáróval, hogy nincs olyan szekvencia.
O(n) időbonyolultságú.
Módosító algoritmusok
Ezek az algoritmusok módosítják az adatszerkezeteket.
copy – lista másolása
template<class InputIterator, class OutputIterator> OutputIterator copy(InputIterator eleje, InputIterator vege, OutputIterator kimenet) { while (eleje!=vege) *kimenet++ = *eleje++; return kimenet; }
A két bemeneti bejáró alapján megadott félig nyílt tartományt, másolja a kimeneti bejáró által mutatott helytől kezdve. Visszatérési értéke egy bejáró a célterületre az utolsó másolt elem után.
O(n) időbonyolultságú.
copy_backward – lista másolása visszafelé
template<class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 copy_backward ( BidirectionalIterator1 eleje, BidirectionalIterator1 vege, BidirectionalIterator2 kimenet ) { while (vege!=eleje) *(--kimenet) = *(--vege); return kimenet; }
A két bejáró (eleje
, vege
) által megadott félig nyílt tartomány másolja az kimenet
bejárótól kezdve visszafelé, a vege-1
lesz az első elem, ami a kimenet-1
helyre kerül.
Visszatérési értéke egy bejáró az átmásolt első elemre.
O(n) időbonyolultságú.
swap – két elem értékének cseréje
template <class T> void swap(T& a, T& b) { T c(a); a=b; b=c; }
Megcseréli a két változó értékét.
swap_ranges – két lista tartalmának megcserélése
template<class ForwardIterator1, class ForwardIterator2> ForwardIterator2 swap_ranges ( ForwardIterator1 eleje1, ForwardIterator1 vege1, ForwardIterator2 eleje2 ) { while (eleje1!=vege1) swap(*eleje1++, *eleje2++); return eleje2; }
Két félig nyílt tartomány elemeit cseréli meg, at első tartomány eleje és vége adott, a másodiknak csak az eleje. Visszatér a második tartomány utolsó eleme utánra mutató bejáróval.
O(n) időbonyolultságú.
iter_swap – két bejáró által mutatott érték cseréje
template <class ForwardIterator1, class ForwardIterator2> void iter_swap(ForwardIterator1 a, ForwardIterator2 b) { swap (*a, *b); }
Két bejáró által mutatott értéket cserél meg.
transform – egy vagy két lista transzformálása
template < class InputIterator, class OutputIterator, class UnaryOperator > OutputIterator transform ( InputIterator eleje1, InputIterator vege1, OutputIterator eredmeny, UnaryOperator op ); template < class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperator > OutputIterator transform ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, OutputIterator eredmeny, BinaryOperator binary_op );
Végigmegy a megadott tartomány (eleje1
, vege1
) vagy két tartomány (eleje2
-től kezdve) elemein.
Elvégzi rajtuk az UnaryOperator
műveletét vagy a BinaryOperator
műveletét. Az eredményt pedig
az eredmeny
bejárótól kezdve írja. Visszatérési értéke egy bejáró az utolsó eredmény elem után.
O(n) időbonyolultságú.
replace – elemek keresése és cseréje
template < class ForwardIterator, class T > void replace ( ForwardIterator eleje, ForwardIterator vege, const T& regi, const T& uj ) { for (; eleje != vege; ++eleje) if (*eleje == regi) *eleje=uj; }
A megadott tartományban (eleje
..vege
), adott értékű elemeket (regi
), lecseréli egy új értékkel (uj
).
O(n) időbonyolultságú.
replace_if – megadott feltételnek eleget tevő elemek cseréje
template < class ForwardIterator, class Predicate, class T > void replace_if ( ForwardIterator eleje, ForwardIterator vege, Predicate feltetel, const T& uj ) { for (; eleje != vege; ++eleje) if (feltetel(*eleje)) *eleje = uj; }
Megadott tartományban (eleje
..vege
) lecseréli azon elemeket, amelyre a feltétel igaz.
O(n) időbonyolultságú.
replace_copy – megadott tartomány másolása, miközben adott értékű elemeket lecserélik
template < class InputIterator, class OutputIterator, class T > OutputIterator replace_copy ( InputIterator eleje, InputIterator vege, OutputIterator eredmeny_hely, const T& regi, const T& uj ) { for (; eleje != vege; ++eleje, ++eredmeny_hely) *result = (*eleje==regi) ? uj: *eleje; return eredmeny_hely; }
Megadott tartományt (eleje
..vege
) másol egy másik helyre (eredmeny_hely
),
miközben lecseréli a megadott értékű elemeket (regi
) egy másik értékre (uj
).
O(n) időbonyolultságú.
replace_copy_if – megadott tartomány másolása, miközben a megadott feltételnek eleget tevő elemeket cseréljük
template < class InputIterator, class OutputIterator, class Predicate, class T > OutputIterator replace_copy_if ( InputIterator eleje, InputIterator vege, OutputIterator eredmeny_hely, Predicate feltetel, const T& uj ) { for (; eleje != vege; ++eleje, ++eredmeny_hely) *eredmeny_hely = (feltetel(*eleje))? uj: *eleje; return eredmeny_hely; }
Megadott tartományt (eleje
..vege
) másol egy másik helyre (eredmeny_hely
),
miközben lecseréli az adott tulajdonságnak megfelelő elemeket (regi
) egy másik értékre (uj
).
O(n) időbonyolultságú.
fill – terület feltöltése adott értékkel
template < class ForwardIterator, class T > void fill(ForwardIterator eleje, ForwardIterator vege, const T& ertek) { while (eleje != vege) *eleje++ = ertek; }
Feltölti a megadott tartományt a megadott értékkel.
fill_n – n elem feltöltése adott értékkel, adott kezdőhelytől kezdve
template < class OutputIterator, class Size, class T > void fill_n(OutputIterator eleje, Size n, const T& ertek) { for (; n>0; --n) *eleje++ = ertek; }
Megadott bejárótól kezdve az első n
elemet beállítja megadott értékre.
generate – terület feltöltése függvény által generált értékekkel
template <class ForwardIterator, class Generator> void generate(ForwardIterator eleje, ForwardIterator vege, Generator generator) { while (eleje != vege) *eleje++ = generator(); }
Megadott tartományt feltölti értékekkel, amellyel a generátorfüggvény vagy funktor tér vissza.
O(n) időbonyolultságú.
generate_n – adott kezdőponttól kezdve n db elem beállítása és feltöltése értékekkel
template <class OutputIterator, class Size, class Generator> void generate_n ( OutputIterator eleje, Size n, Generator generator ) { for (; n>0; --n) *eleje++ = generator(); }
Megadott bejárótól kezdve n
darab elemet ír, melyek értékét a generátor adja.
O(n) időbonyolultságú.
remove – adott értékű elemek törlése a tartományból
template < class ForwardIterator, class T > ForwardIterator remove ( ForwardIterator eleje, ForwardIterator vege, const T& ertek );
Megadott tartományból kitörli azokat az elemeket, amelyek értéke megegyezik a megadottal. Az utánuk lévőket előre másolgatja. Visszatérési értéke egy mutató a tartomány új végére. A régi vége és az új vége közötti elemek megmaradnak, csak az értékük nincs meghatározva.
O(n) időbonyolultságú.
remove_if – adott feltételnek megfelelő értékek törlése a tartományból
template < class ForwardIterator, class Predicate > ForwardIterator remove_if ( ForwardIterator eleje, ForwardIterator vege, Predicate feltetel );
Megadott tartományból kitörli azokat az elemeket, amelyekre a megadott feltétel igaz. Visszatérési értéke egy mutató a tartomány új végére. A régi vége és az új vége közötti elemek megmaradnak, csak az értékük nincs meghatározva.
O(n) időbonyolultságú.
remove_copy – tartomány másolása adott értékek nélkül
template <class InputIterator, class OutputIterator, class T> OutputIterator remove_copy ( InputIterator eleje, InputIterator vege, OutputIterator kimenet, const T& ertek );
A megadott tartományt (eleje
..vege
) átmásolja a megadott kimeneti bejáróhoz (kimenet
) a megadott értékű elemek nélkül.
Visszatérési értéke egy bejáró az átmásolt tartomány végére
O(n) időbonyolultságú.
remove_copy_if – tartomány másolása adott feltételnek eleget tevő elemek nélkül
template <class InputIterator, class OutputIterator, class Predicate> OutputIterator remove_copy_if ( InputIterator eleje, InputIterator vege, OutputIterator kimenet, Predicate feltetel );
A megadott tartományt (eleje
..vege
) átmásolja a megadott kimeneti bejáróhoz (kimenet
) a megadott feltételnek eleget tevő elemek nélkül.
Visszatérési értéke egy bejáró az átmásolt tartomány végére.
O(n) időbonyolultságú.
unique – egymás lévő elemek közül 1 db meghagyása, a többi törlése
template <class ForwardIterator> ForwardIterator unique ( ForwardIterator eleje, ForwardIterator vege ); template <class ForwardIterator, class BinaryPredicate> ForwardIterator unique ( ForwardIterator eleje, ForwardIterator vege, BinaryPredicate feltetel );
Megadott félig nyitott tartományból (eleje
..vege
) törli az egymás mellett lévő azonos értékű elemeket.
Az összehasonlítás az == operátorral vagy a feltetel
predikátummal történik.
Visszatér egy bejáróval az átalakított tartomány végére.
O(n) időbonyolultságú.
unique_copy – másolás, miközben az egymás mellett lévő elemek közül 1 db meghagyása, a többi törlése
template <class InputIterator, class OutputIterator> OutputIterator unique_copy ( InputIterator eleje, InputIterator vege, OutputIterator kimenet ); template <class InputIterator, class OutputIterator, class BinaryPredicate> OutputIterator unique_copy ( InputIterator eleje, InputIterator vege, OutputIterator kimenet, BinaryPredicate feltetel );
A megadott félig nyílt tartományt (eleje
..vege
), másolja egy másik helyre a kimenet
bejáró által mutatott helyre, miközben az egymás mellett lévő azonos értékű elemeket eltávolítja. Az eltávolítás történhet az == operátorral, vagy
a megadott feltétellel. Visszatérési értéke egy bejáró az átmásolt terület végére.
O(n) időbonyolultságú.
reverse – elemek sorrendjének a megfordítása
template <class BidirectionalIterator> void reverse ( BidirectionalIterator eleje, BidirectionalIterator vege ) { while ((eleje!=vege)&&(eleje!=--vege)) swap (*eleje++,*vege); }
A megadott félig nyitott tartomány elemeinek a sorrendjét megfordítja.
O(n) időbonyolultságú.
reverse_copy – elemek másolása fordított sorrendben
template <class BidirectionalIterator, class OutputIterator> OutputIterator reverse_copy ( BidirectionalIterator eleje, BidirectionalIterator vege, OutputIterator kimenet ) { while (eleje!=vege) *kimenet++ = *--vege; return kimenet; }
A megadott félig nyitott tartománynak (eleje
..vege
) az elemeit megfordítva kiírja a kimenetnek megadott bejáróhoz.
O(n) időbonyolultságú.
rotate – tartomány forgatása, amíg az adott elem adott helyre nem kerül
template <class ForwardIterator> void rotate ( ForwardIterator eleje, ForwardIterator kozepe, ForwardIterator vege ) { ForwardIterator kovetkezo = kozepe; while (eleje != kovetkezo) { swap (*eleje++,*kovetkezo++); if (kovetkezo == vege) kovetkezo = kozepe; else if (eleje == kozepe) kozepe = kovetkezo; } }
A megadott félig nyílt tartományt (eleje
..vege
) addig forgatja, amíg a benne lévő megadott elem (kozepe
) az elejére nem kerül.
O(n) időbonyolultságú.
rotate_copy – másolás, közben tartomány forgatása, amíg az adott elem adott helyre nem kerül
template <class ForwardIterator, class OutputIterator> OutputIterator rotate_copy ( ForwardIterator eleje, ForwardIterator kozepe, ForwardIterator vege, OutputIterator kimenet ) { kimenet=copy (kozepe,vege,kimenet); return copy (eleje,kozepe,kimenet); }
Ugyanazt csinálja, mint az előző rotate
függvény, csak ez a megadott bejáróhoz odamásolja a forgatott eredményt.
Visszatérési értéke egy bejáró a másolt tartomány végére.
O(n) időbonyolultságú.
random_shuffle – tartomány összekeverése
template <class RandomAccessIterator> void random_shuffle ( RandomAccessIterator eleje, RandomAccessIterator vege ); template <class RandomAccessIterator, class RandomNumberGenerator> void random_shuffle ( RandomAccessIterator eleje, RandomAccessIterator vege, RandomNumberGenerator& veletlen_generator );
A megadott félig nyílt tartomány elemeit összekeveri: minden elem értékét megcseréli egy véletlenszerűen kiválasztott elem értékével. A keverés történhet valamilyen gyári függvénnyel vagy egy megadott függvénnyel.
O(n) időbonyolultságú.
partition – adott tulajdonságú elemek előre rendezése
template <class BidirectionalIterator, class Predicate> BidirectionalIterator partition ( BidirectionalIterator eleje, BidirectionalIterator vege, Predicate feltetel );
Átrendezi a megadott tartományt úgy, hogy azon elemeket, melyre a feltétel igaz azok elé teszi, amelyre nem igaz. Visszatérési értéke egy bejáró az első elemre, amelyre a feltétel nem igaz.
Következő példában a páratlan számokat rendezzük a párosak elé:
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [1, 9, 3, 7, 5, 6, 4, 8, 2]. A sorrend nem garantált, csak az, hogy azon elemek, melyre a feltétel igaz volt, előre lesznek téve.
A stable_partition
a sorrendet is garantálja.
O(n) időbonyolultságú.
stable_partition – adott tulajdonságú elemek előre rendezése, sorrendjüket megtartva
template <class BidirectionalIterator, class Predicate> BidirectionalIterator stable_partition ( BidirectionalIterator eleje, BidirectionalIterator vege, Predicate feltetel );
Átrendezi a megadott tartományt úgy, hogy azon elemeket, melyre a feltétel igaz azok elé teszi, amelyre nem igaz. Az adott elemek tartományon belüli sorrendjét megtartva. Visszatérési értéke egy bejáró az első elemre, amelyre a feltétel nem igaz.
Következő példában a páratlan számokat rendezzük a párosak elé: [1, 2, 3, 4, 5, 6, 7, 8, 9] => [1, 3, 5, 7, 9, 2, 4, 6, 8].
O(n) időbonyolultságú.
Rendező algoritmusok
Ezekkel lehet tartományokat különféle sorrendbe rendezni.
sort – rendezi a megadott tartományt
template <class RandomAccessIterator> void sort(RandomAccessIterator eleje, RandomAccessIterator vege); template <class RandomAccessIterator, class Compare> void sort(RandomAccessIterator eleje, RandomAccessIterator vege, Compare komparator);
sorba rendezi a megadott tartományt. Az összehasonlításhoz használhatja a <
operátort,
vagy a megadott összehasonlító függvényt.
Időbonyolultsága lehet O(n log(n)) vagy O(n2), implementációtól függően.
stable_sort – sorba rendezi a tartományt, azonos értékű elemek
template <class RandomAccessIterator> void stable_sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare> void stable_sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
sorba rendezi a megadott tartományt. Az összehasonlításhoz használhatja a <
operátort,
vagy a megadott összehasonlító függvényt. Az azonos értékű elemek egymáshoz viszonyított sorrendjét megtartja.
Időbonyolultsága lehet O(n log(n)) vagy O(n2), implementációtól függően.
partial_sort – rendezés, amíg az adott elem a végleges helyére nem kerül
template <class RandomAccessIterator> void partial_sort ( RandomAccessIterator eleje, RandomAccessIterator kozepe, RandomAccessIterator vege ); template <class RandomAccessIterator, class Compare> void partial_sort ( RandomAccessIterator eleje, RandomAccessIterator kozepe, RandomAccessIterator vege, Compare komparator );
Részlegesen rendezi a megadott tartományt (eleje
..vege
), úgy, hogy a kiválasztott
elemnél kozepe
kisebbek a tartomány elejére lesznek rendezve, az utána lévők pedig nem lesznek rendezve.
Az összehasonlításhoz használhatja a <
operátort,
vagy a megadott összehasonlító függvényt.
Időbonyolultsága O(n2). Minél kisebb elemet választunk ki, annál gyorsabban végez.
partial_sort_copy – másol, közben rendezés, amíg az adott elem a végleges helyére nem kerül
template <class InputIterator, class RandomAccessIterator> RandomAccessIterator partial_sort_copy ( InputIterator eleje, InputIterator vege, RandomAccessIterator ki_eleje, RandomAccessIterator ki_vege ); template <class InputIterator, class RandomAccessIterator, class Compare> RandomAccessIterator partial_sort_copy ( InputIterator eleje, InputIterator vege, RandomAccessIterator ki_eleje, RandomAccessIterator ki_vege, Compare vege );
A megadott tartomány (eleje
..vege
) legkisebb elemeit rendezve átmásolja a
megadott másik tartományhoz (ki_eleje
..ki_vege
). Az összehasonlításhoz használhatja a <
operátort,
vagy a megadott összehasonlító függvényt. Visszatérési értéke egy bejáró a rendezett tartomány végére.
Időbonyolultsága O(nm).
nth_element – rendezett sorozatban helyére teszi az n. elemet
template <class RandomAccessIterator> void nth_element ( RandomAccessIterator eleje, RandomAccessIterator n_edik, RandomAccessIterator vege ); template <class RandomAccessIterator, class Compare> void nth_element ( RandomAccessIterator eleje, RandomAccessIterator n_edik, RandomAccessIterator vege, Compare comp );
Részben átrendezi a megadott tartományt (eleje
..vege
) úgy, hogy megadott helyen lévő elem (n_edik) a helyén legyen, tehát minden nála kisebb
elem előtte, minden nagyobb, pedig mögé kerül, csak a megadott elem lesz a helyén, a többi nem garantált, hogy rendezve lesz.
Például vegyük ezt a tömböt: [1, 2, 3, 9, 8, 5, 7, 4, 6]. Szeretnénk a helyére tenni a leendő rendezett sorozat hatodik elemét, akkor az algoritmus lefutása után valami ilyesmit kapunk: [3, 1, 4, 2, 5, 6, 9, 7, 8]
Időbonyolultsága O(n).
Bináris keresés
Ezzel a keresési lehetőséggel egy már rendezett tartományban kereshetünk elemeket.
binary_search – bináris keresés
template <class ForwardIterator, class T> bool binary_search ( ForwardIterator eleje, ForwardIterator vege, const T& ertek ); template <class ForwardIterator, class T, class Compare> bool binary_search ( ForwardIterator eleje, ForwardIterator vege, const T& ertek, Compare komparator );
Bináris kereséssel megkeresi a megadott értékű elemet a megadott rendezett tartományban. Igazzal tér vissza, ha megtalálta, különben hamissal.
Időbonyolultsága O(log n).
lower_bound – azonos értékű elemek tartományának az elejével tér vissza
template <class ForwardIterator, class T> ForwardIterator lower_bound ( ForwardIterator eleje, ForwardIterator vege, const T& ertek ); template <class ForwardIterator, class T, class Compare> ForwardIterator lower_bound ( ForwardIterator eleje, ForwardIterator vege, const T& ertek, Compare komparator );
Bináris kereséssel megkeresi az első elemet az adott rendezett tartományban, amelynek értéke egyezik a keresettnél vagy nagyobb nála, ha a keresett elem minden más elemnél nagyobb, akkor a vege
bejáróval tér vissza.
Példa: ebben a tömbben: [1, 2, 3, 4, 5, 5, 5, 6, 7] az 5 keresése egy bejáróval tér vissza a 5. elemre.
Időbonyolultsága O(log n).
upper_bound – azonos értékű elemek tartományának a végével tér vissza
template <class ForwardIterator, class T> ForwardIterator upper_bound ( ForwardIterator eleje, ForwardIterator vege, const T& ertek ); template <class ForwardIterator, class T, class Compare> ForwardIterator upper_bound ( ForwardIterator eleje, ForwardIterator vege, const T& ertek, Compare komparator );
Bináris kereséssel megkeresi az első elemet az adott rendezett tartományban, melynek az értéke nagyobb, mint a keresett.
Példa: ebben a tömbben: [1, 2, 3, 4, 5, 5, 5, 6, 7] az 5 keresése egy bejáróval tér vissza a 8. elemre.
Időbonyolultsága O(log n).
equal_range – azonos értékű elemek tartományának a lekérdezése
template <class ForwardIterator, class T> pair<ForwardIterator,ForwardIterator> equal_range ( ForwardIterator eleje, ForwardIterator vege, const T& ertek ); template <class ForwardIterator, class T, class Compare> pair<ForwardIterator,ForwardIterator> equal_range ( ForwardIterator eleje, ForwardIterator vege, const T& ertek, Compare komparator );
Visszatér egy bejárópárral az azonos értékű elemeket tartalmazó tartományra a megadott rendezett tartományban.
Időbonyolultsága O(log n).
Halmazműveletek rendezett tartományokon
Ezek az algoritmusok rendezett tartományokon végeznek különféle halmazműveleteket.
merge – két rendezett sorozat összefésülése
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator merge ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet ); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator merge ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet, Compare komparator );
Két rendezett tartományt fésüli össze egy rendezett tartománnyá a kimeneten, az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
O(n + m) időbonyolultságú.
inplace_merge – két rendezett sorozat összefésülése helyben
template <class BidirectionalIterator> void inplace_merge ( BidirectionalIterator eleje, BidirectionalIterator kozepe, BidirectionalIterator vege ); template <class BidirectionalIterator, class Compare> void inplace_merge ( BidirectionalIterator eleje, BidirectionalIterator kozepe, BidirectionalIterator vege, Compare komparator );
Két egymás után lévő rendezett tartományt (eleje
..kozepe
és kozepe
..vege
), helyben összefésül.
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
O(n + m) időbonyolultságú.
includes – részhalmaz függvény
template <class InputIterator1, class InputIterator2> bool includes ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2 ); template <class InputIterator1, class InputIterator2, class Compare> bool includes ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, Compare komparator );
Igazzal tér vissza ha az eleje2
..vege2
rendezett tartomány minden eleme benne van a eleje1
..vege1
rendezett tartományban.
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
O(n + m) időbonyolultságú.
set_union – halmaz unió
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_union ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet ); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_union ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet, Compare komparator );
A két megadott rendezett tartományt összefésüli a kimeneti bejáróhoz úgy, hogy az azonos értékű elemeket csak egyszer szerepelteti (kivéve, ha az egyik tartományban alapból több van belőle).
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
Visszatérési értéke egy bejáró az átmásolt tartomány végére.
O(n + m) időbonyolultságú.
set_intersection – halmaz metszet.
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_intersection ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet ); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_intersection ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet, Compare komparator );
A két megadott rendezett tartomány közös elemeit másolja át a kimenetre.
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
Visszatérési értéke egy bejáró az átmásolt tartomány végére.
set_difference – halmazok különbsége
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_difference ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet ); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_difference ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet, Compare komparator );
Két megadott rendezett tartományból azon elemeket másolja a kimeneti bejáróhoz,
amelyek benne vannak az első tartományban (eleje1
..vege1
) , de nincsenek benne a másodikban (eleje2
..vege2
) .
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
Visszatérési értéke egy bejáró az átmásolt tartomány végére.
O(n + m) időbonyolultságú.
set_symmetric_difference – halmazok szimmetrikus különbsége
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_symmetric_difference ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet ); template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> OutputIterator set_symmetric_difference ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, OutputIterator kimenet, Compare komparator );
Két megadott rendezett tartományból azon elemeket másolja a kimeneti bejáróhoz, amelyek vagy benne vannak az egyik tartományban, vagy a másikban, de nem mindkettőben.
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
Visszatérési értéke egy bejáró az átmásolt tartomány végére.
O(n + m) időbonyolultságú.
Kupac műveletek
Ebben a részben a kupac adatszerkezettel kapcsolatos műveletek. Ez tulajdonképpen a priority_queue
adatszerkezethez hasonlóan működik.
make_heap – kupaccá rendezi az adatszerkezetet, a legnagyobb elem lesz elöl
template <class RandomAccessIterator> void make_heap ( RandomAccessIterator eleje, RandomAccessIterator vege ); template <class RandomAccessIterator, class Compare> void make_heap ( RandomAccessIterator eleje, RandomAccessIterator vege, Compare komparator );
Átrendezi a megadott tartományt egy kupac adatszerkezetbe, hogy a legnagyobb eleme legyen az első.
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
O(n) időbonyolultságú.
push_heap – elem beszúrása a kupacba
template <class RandomAccessIterator> void push_heap ( RandomAccessIterator eleje, RandomAccessIterator vege ); template <class RandomAccessIterator, class Compare> void push_heap ( RandomAccessIterator eleje, RandomAccessIterator vege, Compare komparator );
Az eleje
..vege-1
félig nyílt tartományban lévő kupacba beszúrja a vege-1
helyen lévő elemet.
Az eleje
..vege-1
tartománynak kupacnak kell lennie (make_heap
-pel létrehozva).
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
Időbonyolultsága O(log(n)).
pop_heap – legnagyobb elem kivétele a kupacból
template <class RandomAccessIterator> void pop_heap ( RandomAccessIterator eleje, RandomAccessIterator vege ); template <class RandomAccessIterator, class Compare> void pop_heap ( RandomAccessIterator eleje, RandomAccessIterator vege, Compare komparator );
Megadott kupac tartományból legnagyobb elemet (a legelső) kiveszi, és az utolsó elem helyére (vege-1
) teszi.
Így az első helyen a második legnagyobb lesz.
A művelet után már csak az eleje
..vege-1
tartomány lesz kupac.
Az elemek összehasonlítását végezheti a <
operátorral vagy saját predikátummal.
Időbonyolultsága O(log(n)).
sort_heap – kupac rendezése
template <class RandomAccessIterator> void sort_heap ( RandomAccessIterator eleje, RandomAccessIterator vege ); template <class RandomAccessIterator, class Compare> void sort_heap ( RandomAccessIterator eleje, RandomAccessIterator vege, Compare komparator );
A megadott kupac tartományt növekvő sorrendbe rendezi. A rendezés után a tartomány már nem minősül kupacnak.
O(n log n) időbonyolultságú.
Egyéb algoritmusok
min
template <class T> const T& min(const T& a, const T& b); template <class T, class Compare> const T& min(const T& a, const T& b, Compare komparator);
A két paramétere közül visszatér a kisebbel.
Az összehasonlítást végezheti a <
operátorral vagy saját predikátummal.
O(n) időbonyolultságú.
max
template <class T> const T& max(const T& a, const T& b); template <class T, class Compare> const T& max(const T& a, const T& b, Compare komparator);
A két paramétere közül visszatér a nagyobbal.
Az összehasonlítást végezheti a <
operátorral vagy saját predikátummal.
O(n) időbonyolultságú.
min_element – legkisebb elemre mutató bejáró lekérdezése
template <class ForwardIterator> ForwardIterator min_element ( ForwardIterator eleje, ForwardIterator vege ); template <class ForwardIterator, class Compare> ForwardIterator min_element ( ForwardIterator eleje, ForwardIterator vege, Compare komparator );
Megadott tartományból visszatér a legkisebb elemre mutató bejáróval.
Az összehasonlítást végezheti a <
operátorral vagy saját predikátummal.
O(n) időbonyolultságú.
max_element – legnagyobb elemre mutató bejáró lekérdezése
template <class ForwardIterator> ForwardIterator max_element ( ForwardIterator eleje, ForwardIterator vege ); template <class ForwardIterator, class Compare> ForwardIterator max_element ( ForwardIterator eleje, ForwardIterator vege, Compare komparator );
Megadott tartományból visszatér a legnagyobb elemre mutató bejáróval.
Az összehasonlítást végezheti a <
operátorral vagy saját predikátummal.
O(n) időbonyolultságú.
lexicographical_compare – lexikális összehasonlítás
template <class InputIterator1, class InputIterator2> bool lexicographical_compare ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2 ); template <class InputIterator1, class InputIterator2, class Compare> bool lexicographical_compare ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, InputIterator2 vege2, Compare komparator );
Lexikális összehasonlítást végez két tartomány között.
A két tartomány elemei rendre összehasonlítja.
Az első különböző értékű elempár esetén, ha az első tartományban kisebb volt az elem, igazzal tér vissza, különben hamissal.
Ha nincs különböző elem, és az első tartományon hamarabb ér végig, akkor is igazzal tér vissza, különben hamissal.
Az összehasonlítást végezheti a <
operátorral vagy saját predikátummal.
O(n) időbonyolultságú.
next_permutation – egy számsor következő permutációját állítja elő
template <class BidirectionalIterator> bool next_permutation ( BidirectionalIterator eleje, BidirectionalIterator vege ); template <class BidirectionalIterator, class Compare> bool next_permutation ( BidirectionalIterator eleje, BidirectionalIterator vege, Compare comp );
Átalakítja a megadott tartományt a következő lexikografikusan eggyel nagyobb permutációra.
Igazzal tér vissza, ha az átalakítás elvégezhető, hamissal, ha a tartomány már a legnagyobb lehetséges permutáció.
Az összehasonlítást végezheti a <
operátorral vagy saját predikátummal.
Példa: [1 2 3] => [1 3 2], [1 5 4 3 2] => [2 1 3 4 5]
O(n) időbonyolultságú.
prev_permutation – egy számsor előző permutációját állítja elő
template <class BidirectionalIterator> bool prev_permutation ( BidirectionalIterator eleje, BidirectionalIterator vege ); template <class BidirectionalIterator, class Compare> bool prev_permutation ( BidirectionalIterator eleje, BidirectionalIterator vege, Compare comp );
Átalakítja a megadott tartományt a következő lexikografikusan eggyel kisebb permutációra.
Igazzal tér vissza, ha az átalakítás elvégezhető, hamissal, ha a tartomány már a legkisebb lehetséges permutáció.
Az összehasonlítást végezheti a <
operátorral vagy saját predikátummal.
Példa: [1 3 2] => [1 2 3], [2 1 3 4 5] => [1 5 4 3 2]
O(n) időbonyolultságú.
Egyéb adattípusok és függvények
Egyéb standard C++ típusokról lesz szó itt:
complex osztály
A complex
fejlécben van.
Ez egy komplex számot reprezentáló osztály vagyis sablon. A komplex számok x + yi alakban vannak megadva, ahol definíció szerint i² = -1.
A sablon fejléce:
template <class T> class complex;
Típusai
value_type
A sablonparaméter-típus.
Konstruktorai
public: complex(const T& valos = T(), const T& kepzetes = T()); complex(const complex& cmplx); template<class X> complex(const complex<X>& cmplx);
Ezek az alap konstruktorok és a másoló konstruktorok.
imag metódus
T imag() const;
Lekérdezi a képzetes részét a komplex számnak.
real metódus
T real() const;
Lekérdezi a valós részét a komplex számnak.
Operátorai
Minden operátorral rendelkezik, amellyel egy aritmetikai típusnak rendelkeznie kell. Inkább nem sorolom fel őket.
Kivételekkel kapcsolatos osztályok és függvények
Az exception osztály
Ez az az osztály, amelynek leszármazottait az standard függvénytár függvényei és metódusai dobják, hiba esetén.
Megadása
class exception { public: exception(); exception(const exception&); exception& operator= (const exception&); virtual ~exception(); virtual const char* what() const; }
Az egyetlen értelmes metódusa a what
, amely egy nullával lezárt karakterláncként adja vissza, hogy miről is van szó.
bad_exception osztály
Ez egy speciális kivétel, amelyet akkor dobnak, hogyha a függvény olyan kivételt dob, amely nincs felsorolva kivételspecifikációk között. Természetesen ahhoz, hogy el lehessen kapni, ezt a kivételt is fel kell sorolni a kivételspecifikációba.
Kivételekkel kapcsolatos adattípusok
unexpected_handler, terminate_handler
typedef void (*unexpected_handler)(); typedef void (*terminate_handler)();
Ezek paraméter és visszatérési érték nélküli függvénymutató típusok. Kontextustól függ, hogy melyiket használjuk.
set_unexpected – váratlan kivétel esetén hívódó függvény beállítása
unexpected_handler set_unexpected(unexpected_handler f);
Beállít egy függvényt, amely akkor hívódik, ha egy függvény olyan kivételt dob, amely nincs a kivétel specifikációjában.
Az alapértelmezett függvény egyszerűen meghívja a terminate
függvényt. Visszatérési értéke
a korábbi függvény címe lesz.
unexpected – váratlan kivétel esetén hívódik
void unexpected();
Ez a függvény hívódik, amikor egy függvény olyan kivételt dob, amely nincs a kivétel specifikációjában.
set_terminate függvény – kezeletlen kivétel esetén hívandó függvényt állít be
terminate_handler set_terminate (terminate_handler f)
Beállítja a függvényt, amely a terminate
hívásakor hívódik. Az alapértelmezett a standard abort
függvény.
terminate – kezeletlen kivétel esetén hívódik
void terminate();
Akkor hívódik, amikor egy kivételt nem kezelünk le.
uncaught_exception – igazzal tér vissza, ha épp van feldobva kivétel, különben hamis
bool uncaught_exception()
Igazzal tér vissza, ha van feldobva kivétel, de még nem kapták el, hamis különben. Kivétel feldobása és elkapása között csak destruktorok futhatnak le, így ez a függvény csak ott adhat vissza igaz értéket.
Standard funktorok
A functional
fejlécben van.
A funktorok olyan osztályok, amelyek felülbírálják a ()
operátort, így függvényként használhatók.
Gyakran sablonparaméterként szerepelnek, főleg a less
.
unary_function – egyparaméteres függvény
Az egyparaméteres funktorok őse, csak egy struktúra mely két belső típust definiál.
template <class Arg, class Result> struct unary_function { typedef Arg argument_type; typedef Result result_type; };
binary_function – kétparaméteres függvény
Ez a kétparaméteres funktorok őse:
template <class Arg1, class Arg2, class Result> struct binary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; };
Operátoroknak megfelelő funktor objektumok
A következő táblázatban foglalom össze az operátorokat és a neki megfelelő functorokat. Különösebb magyarázatra nem szorulnak, értelemszerűen annyi paraméterük van amennyi az operátornak, és a visszatérési értékük is az operátornak megfelelő.
Ezek mindahányan sablonok, melyeknek egyetlen típusparamétere az operandusok típusa.
Operátor | Funktor |
---|---|
+ | plus |
- | minus |
* | multiplies |
/ | divides |
% | modulus |
- | negate |
== | equal_to |
!= | not_equal_to |
> | greater |
< | less |
>= | greater_equal |
<= | less_equal |
&& | logical_and |
|| | logical_or |
! | logical_not |
Negátorok
A negátor egy olyan funktor, amely egyparaméteres vagy kétparaméteres funktor ellentettjét hozza létre. Kettő van belőle. Gyakorlatilag a !
operátort alkalmazza a megadott funktoron.
unary_negate – egyparaméteres funktor ellentettjének előállítása
Ez egy részleges sablonspecializáció, egyparaméteres funktorok negálására. Így néz ki:
template <class Predicate> class unary_negate : public unary_function <typename Predicate::argument_type,bool> { protected: Predicate fn; public: explicit unary_negate ( const Predicate& pred ) : fn (pred) {} bool operator() (const typename Predicate::argument_type& x) const { return !fn(x); } };
A not1
függvénnyel lehet ennek egy példányát megkapni:
template <class Predicate> unary_negate<Predicate> not1(const Predicate& pred);
binary_negate – kétparaméteres funktor ellentettjének előállítása
Ez egy részleges sablonspecializáció, kétparaméteres funktorok negálására. Így néz ki:
template <class Predicate> class binary_negate :public binary_function <typename Predicate::first_argument_type, typename Predicate::second_argument_type, bool> { protected: Predicate fn; public: explicit binary_negate ( const Predicate& pred ) : fn (pred) {} bool operator() (const typename Predicate::first_argument_type& x, const typename Predicate::second_argument_type& y) const { return !fn(x,y); } };
A not2
függvénnyel lehet ezeknek egy példányát megkapni:
template <class Predicate> binary_negate<Predicate> not2 (const Predicate& pred);
Paraméterkötő funktorok
Ezzel kétparaméteres funktorok egyik paraméterét egy értékhez köthetjük, egyparaméteressé téve azt. Két fajtája van: az egyik az első, a másik a második paramétert köti.
binder1st – kétparaméteres funktor első paraméterét köti
template <class Operation> class binder1st : public unary_function <typename Operation::second_argument_type, typename Operation::result_type> { protected: Operation op; typename Operation::first_argument_type value; public: binder1st(const Operation& x, const typename Operation::first_argument_type& y) : op (x), value(y) {} typename Operation::result_type operator() (const typename Operation::second_argument_type& x) const { return op(value,x); } };
Ennek egy példányát a bind1st
függvénnyel lehet létrehozni:
template <class Operation, class T> binder1st<Operation> bind1st (const Operation& op, const T& x);
binder2nd – kétparaméteres funktor második paraméterét köti
template <class Operation> class binder2nd : public unary_function <typename Operation::first_argument_type, typename Operation::result_type> { protected: Operation op; typename Operation::second_argument_type value; public: binder2nd ( const Operation& x, const typename Operation::second_argument_type& y) : op (x), value(y) {} typename Operation::result_type operator() (const typename Operation::first_argument_type& x) const { return op(x,value); } };
Ennek egy példányát a bind2nd
függvénnyel lehet létrehozni:
template <class Operation, class T> binder2nd<Operation> bind2nd (const Operation& op, const T& x);
Függvénymutatóból funktor
ptr_fun
template <class Arg, class Result> pointer_to_unary_function<Arg,Result> ptr_fun (Result (*f)(Arg)); template <class Arg1, class Arg2, class Result> pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun (Result (*f)(Arg1,Arg2));
Egyparaméteres, illetve kétparaméteres függvényből csinál egy funktort.
A visszatérési érték típusa az unary_function
és a binary_function
típusból vannak származtatva, értelemszerűen.
mem_fun, const_mem_fun
template <class S, class T> mem_fun_t<S,T> mem_fun (S (T::*f)()); template <class S, class T, class A> mem_fun1_t<S,T,A> mem_fun (S (T::*f)(A)); template <class S, class T> const_mem_fun_t<S,T> mem_fun (S (T::*f)() const); template <class S, class T, class A> const_mem_fun1_t<S,T,A> mem_fun (S (T::*f)(A) const);
Tagfüggvénymutatót lehet vele funktorrá alakítani. A tagfüggvény lehet paraméter nélküli vagy egyparaméteres.
A visszatérési érték típus a paraméter nélküli esetén az unary_function
, egyparaméteres esetben
pedig a binary_function
függvényből származik.
Ezen funktorok első paramétere egy mutató az objektumra, amelyen a tagfüggvény hívódik.
mem_fun_ref
template <class S, class T> mem_fun_ref_t<S,T> mem_fun_ref (S (T::*f)()); template <class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun_ref (S (T::*f)(A)); template <class S, class T> const_mem_fun_ref_t<S,T> mem_fun_ref (S (T::*f)() const); template <class S, class T, class A> const_mem_fun1_ref_t<S,T,A> mem_fun_ref (S (T::*f)(A) const);
Tagfüggvénymutatót lehet vele funktorrá alakítani. A tagfüggvény lehet paraméter nélküli vagy egyparaméteres.
A visszatérési érték típus a paraméter nélküli esetén az unary_function
, egyparaméteres esetben
pedig a binary_function
függvényből származik.
Ezen funktorok első paramétere egy referencia az objektumra, amelyen a tagfüggvény hívódik.
bejáró osztályok
Az iterator
fejlécben van.
Korábban már volt szó az bejárókról, most itt leírom, hogy milyen osztályokkal valósítódnak meg.
bejáró struktúrák
iterator ősosztály
Ez egy típussablon, semmi értelme adatmezője, se metódusa nincs, így néz ki:
template <class Category, class T, class Distance = ptrdiff_t, class Pointer = T*, class Reference = T&> struct iterator { typedef T value_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference; typedef Category iterator_category; };
Csak a kategória és a mutatót érték típusa, ami kötelező. A kategóriák a következők lehetnek:
- input_iterator_tag
- Bemeneti bejáró
- output_iterator_tag
- Kimeneti bejáró
- forward_iterator_tag
- Egyirányú bejáró
- bidirectional_iterator_tag
- Kétirányú bejáró
- random_access_iterator_tag
- Közvetlen elérésű bejáró
iterator_traits
Ez egy olyan sablon, amely egy bejáró szerepű típust (ez lehet egy mutató vagy akár egy egész szám is akár) vár sablonparaméternek. Ez felfogható egyfajta metastruktúrának, amely egy bejáró tulajdonságait írja le. Megadása ilyen:
template <class Iterator> struct iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; };
Illetve van két sablonspecializácója mutatókra:
template <class T> struct iterator_traits<T*> { typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; typedef random_access_iterator_tag iterator_category; } template <class T> struct iterator_traits<const T*> { typedef ptrdiff_t difference_type; typedef T value_type; typedef const T* pointer; typedef const T& reference; typedef random_access_iterator_tag iterator_category; }
bejáró függvények
advance függvény – bejáró léptetése
bejárók megadott értékkel való előreléptetésére használható.
template <class InputIterator, class Distance> void advance(InputIterator& i, Distance n);
Előrelépteti az bejárót a megadott lépésszámmal. Tetszőleges elérésű bejáró esetén a +
és -
operátorokat használja. Más bejárók esetén a ismétlődően hívogatja a ++
és --
bejárókat.
- i
- Az bejáró, amit előre kellene léptetni.
- n
-
Valamilyen numerikus típus (valószínűleg valami
iterator_traits<InputIterator>::difference_type
), amellyel megadhatjuk, hogy mennyivel kell előreléptetni az bejárót. Csak tetszőleges elérésű és kétirányú bejáró esetén lehet az értéke negatív.
Visszatérési értéke az előreléptetett bejáró.
distance függvény – két bejáró távolsága
template<class InputIterator> typename iterator_traits<InputIterator>::difference_type distance(InputIterator eleje, InputIterator vege);
Két bejáró közötti távolságot adja vissza. Tetszőleges elérésű bejáró esetén a -
operátort használja, Más bejárók esetén a ++
operátorral növeli a eleje
bejárót addig, amíg el nem éri a vege
értékét.
Beszúrók
Ezek olyan kimeneti bejárók, amelyek beszúrnak elemeket az adatszerkezetbe, ahelyett, hogy meglévőket írnának felül.
back_insert_iterator – ez az adatszerkezet végére szúr be elemeket
Ez egy olyan beszúró bejáró, amely egy adatszerkezet végéhez tud elemeket beszúrni. A következő függvény használatával lehet ilyet kapni:
template <class Container> back_insert_iterator<Container> back_inserter(Container& x);
A definíciója pedig így néz ki:
template <class Container> class back_insert_iterator : public iterator<output_iterator_tag,void,void,void,void> { protected: Container* container; public: typedef Container container_type; explicit back_insert_iterator (Container& x) : container(&x) {} back_insert_iterator<Container>& operator= (typename Container::const_reference value) { container->push_back(value); return *this; } back_insert_iterator<Container>& operator* () { return *this; } back_insert_iterator<Container>& operator++ () { return *this; } back_insert_iterator<Container> operator++ (int) { return *this; } };
Ez azt jelenti, hogy egy ilyen bejárón az = operátor elemet szúr be a hozzárendelt adatszerkezetbe, még akkor is ha a * operátoron keresztül elemet érünk el rajta.
Az is látható, hogy a mutatott adatszerkezetnek támogatnia kell a push_back
metódust.
front_insert_iterator – ez az elejére szúr be elemeket
Ez egy olyan beszúró bejáró, amellyel az adatszerkezet elejére lehet beszúrni elemeket. A következő függvénnyel kaphatunk ilyen bejárót.
template <class Container> front_insert_iterator<Container> front_inserter(Container& x);
Definíciója pedig így néz ki:
template <class Container> class front_insert_iterator : public iterator<output_iterator_tag,void,void,void,void> { protected: Container* container; public: typedef Container container_type; explicit front_insert_iterator (Container& x) : container(&x) {} front_insert_iterator<Container>& operator= (typename Container::const_reference value) { container->push_front(value); return *this; } front_insert_iterator<Container>& operator* () { return *this; } front_insert_iterator<Container>& operator++ () { return *this; } front_insert_iterator<Container> operator++ (int) { return *this; } };
Hasonlóképpen működik, mint a végére beszúró bejáró, csak ez az adatszerkezet elejére szúr be dolgokat.
insert_iterator – ez az általános beszúró bejáró
Ez az általános beszúró bejáró, amely bárhova képes elemeket beszúrni a megadott adatszerkezetben. A következő függvény használatával kaphatunk egy ilyet:
template <class Container, class Inserter> insert_iterator<Container> inserter (Container& x, Inserter i);
Megadása az előző beszúrókhoz hasonló:
template <class Container> class insert_iterator : public iterator<output_iterator_tag,void,void,void,void> { protected: Container* container; typename Container::iterator iter; public: typedef Container container_type; explicit insert_iterator (Container& x, typename Container::iterator i) : container(&x), iter(i) {} insert_iterator<Container>& operator= (typename Container::const_reference value) { iter=container->insert(iter,value); ++iter; return *this; } insert_iterator<Container>& operator*() { return *this; } insert_iterator<Container>& operator++() { return *this; } insert_iterator<Container> operator++(int) { return *this; } };
Előredefiniált bejárók
Ezeket használják az adatstruktúrák is (többnyire).
reverse_iterator – megfordítja az bejárót
template <class Iterator> class reverse_iterator;
Ez a sablon egy fordított bejárót hoz létre egy meglévő bejáróból. Csak kétirányú és tetszőleges elérésű bejárókra működik. Ez az bejáró fordítva működik. Az előre művelete hátra léptet, a hátra művelete pedig előre.
Az általa csomagolt bejáró az
Iterator base() const;
metódussal érhető el.
Az bejáró és a belső bejáró különböző elemre mutat. (A belső bejáró eggyel előrébb).
istream_iterator – bejáró bemeneti adatfolyamhoz
template <class T, class charT=char, class traits=char_traits<charT>, class Distance = ptrdiff_t> class istream_iterator;
Ez egy bemeneti bejáró, mellyel egy bemeneti adatfolyamból lehet T
típusú adatot olvasni. Egyparaméteres konstruktora egy istream
típusú paramétert vár. Az alapértelmezett konstruktora egy adatfolyamvég bejárót csinál, amely használható annak eldöntésére, hogy az bejáró az adatfolyam végén áll.
ostream_iterator – bejáró kimeneti adatfolyamhoz
template <class T, class charT=char, class traits=char_traits<charT>, class Distance = ptrdiff_t> class ostream_iterator;
Ez egy kimeneti bejáró, mellyel egy kimeneti adatfolyamba lehet T
típusú adatot írni. Egyparaméteres konstruktora egy ostream
típusú paramétert vár. Az alapértelmezett konstruktora egy adatfolyamvég bejárót csinál, amely használható annak eldöntésére, hogy az bejáró az adatfolyam végén áll.
istreambuf_iterator – bejáró bemeneti streambuf-hoz
template <class charT, class traits=char_traits<charT> > class istreambuf_iterator;
Ez egy bemeneti bejáró, amelyből charT
típusú karaktereket lehet olvasgatni.
Egyparaméteres konstruktora tud bejárót csinálni egy streambuf
és egy istream
típusú objektumból is.
Az alapértelmezett konstruktora egy puffervég bejárót csinál, amely használható annak eldöntésére, hogy az bejáró az adatfolyam végén áll.
ostreambuf_iterator
template <class charT, class traits=char_traits<charT> > class ostreambuf_iterator;
Ez egy kimeneti bejáró, amellyel charT
típusú karaktereket lehet írogatni.
Egyparaméteres konstruktora tud bejárót csinálni egy streambuf
és egy ostream
típusú objektumból is.
Az alapértelmezett konstruktora egy puffervég bejárót csinál, amely használható annak eldöntésére, hogy az bejáró az adatfolyam végén áll (összehasonlítással).
limits fejléc
Típusok értékhatárainak eléréséhez szolgáló sablon van bele.
numeric_limits
A numeric_limits sablon a következőképpen van megadva:
template <class T> class numeric_limits { public: static const bool is_specialized = false; // Igaz minden specializációra. static T min() throw(); // A típus által ábrázolható legkisebb véges érték static T max() throw(); // A típus által ábrázolható legnagyobb véges érték. static const int digits = 0; // Egész számok esetén az értékes számjegyek bitszáma (előjelbit nélkül), valós számok esetén a mantissza bitszáma. static const int digits10 = 0; // Ábrázolható értékes számjegyek maximális száma (tízes számrendszerben). static const bool is_signed = false; // Előjeles számokra igaz. static const bool is_integer = false; // Egész számokra igaz static const bool is_exact = false; // Igaz, ha egzakt reprezentációt használ (egész számokra igaz, valósra hamis). static const int radix = 0; // Ábrázoláshoz használt számrendszer alapja (2). static T epsilon() throw(); // Különbség 1 és hozzá legközelebbi, de nála nagyobb szám között. static T round_error() throw(); // A legnagyobb kerekítési hiba mértéke. static const int min_exponent = 0; // Minimális nagyságrend (kettes számrendszerben) static const int min_exponent10 = 0; // Minimális nagyságrend (10-es számrendszerben) static const int max_exponent = 0; // Maximális nagyságrend (kettes számrendszerben) static const int max_exponent10 = 0; // Maximális nagyságrend (10-es számrendszerben) static const bool has_infinity = false; // Igaz, ha értelmezi a végtelen fogalmát. static const bool has_quiet_NaN = false; // Igaz, ha értelmezi a csendes „nem szám” fogalmát. static const bool has_signaling_NaN = false; // Igaz, ha értelmezi a jelző generáló „nem szám” fogalmát. static const float_denorm_style has_denorm = denorm_absent; // Támogatja-e a normálatlan értékeket. Lehetséges értékei: denorm_indeterminate, denorm_absent, denorm_present static const bool has_denorm_loss = false; // Igaz, ha a típus tudja érzékelni a normálatlan veszteséget. static T infinity() throw(); // A pozitív végtelen értéke static T quiet_NaN() throw(); // Csendes „nem szám” static T signaling_NaN() throw(); // Jelző „nem szám” static T denorm_min() throw(); // Legkisebb értékű normálatlan szám. static const bool is_iec559 = false; // Igaz, ha a típus IEC559 szabványt követ. static const bool is_bounded = false; // Igaz, ha a típus által felvehető értékek száma véges. (Szerintem mindig igaz) static const bool is_modulo = false; // Igaz, ha a típus értéke átfordul egy bizonyos érték meghaladása után. static const bool traps = false; // Igaz, ha a típus értékkészletében van legalább egy olyan érték, amely valamelyik aritmetikai műveletnél alkalmazva hibát generál. (egész számok nullával való osztás). static const bool tinyness_before = false; // Igaz, ha kerekítés előtt érzékeli a rendszer, hogy a szám túl kicsi (normálatlan). static const float_round_style round_style = round_toward_zero; // A kerekítés módját határozza meg: round_indeterminate, round_toward_zero, round_to_nearest, round_toward_infinity, round_toward_neg_infinity. }
Minden egyes alap számtípusra létezik specializációja.
A locale függvénytár
A <locale>
fejlécben van.
Ezzel nyelvspecifikus dolgokat állíthatunk be (dátum, számformátum, pénzformátum, stb). Ez egy elég nagy téma, részletesen nem megyek bele inkább.
Memóriakezelő dolgok
A <memory>
fejlécben van.
A standard függvénytárban van egy pár memóriakezelő függvény (és annál több típus), amelyek elég hasznosak.
Az allocator sablon
Ez az alapértelmezett memóriafoglaló, amelyet minden használ, ha nem adunk meg mást.
A sablon megadása.
template < class T > class allocator;
Ahol T
az objektum típusa, amit lefoglalni szeretnénk.
Lehet készíteni hozzá specializációt.
Belső típusai
A következő belső típusai vannak:
- value_type
- T
- pointer
- T*
- reference
- T&
- const_pointer
- const T*
- const_reference
- const T&
- size_type
- size_t
- difference_type
- ptrdiff_t
Konstruktorok
allocator() throw(); allocator(const allocator&) throw(); template <class U> allocator(const allocator<U>&) throw();
Ezek a standard memóriafoglaló esetén semmi extrát nem csinálnak.
Destruktor
~allocator() throw();
Nem csinál semmit.
address metódus – &x
pointer address(reference x) const; const_pointer address(const_reference x) const;
Visszatér a paraméter címével. Standard memóriafoglaló esetén ez lényegében &x.
allocate metódus – new
pointer allocate(size_type n, allocator<void>::const_pointer hint=0);
Megadott számú (n) elemet foglal le és visszatér a blokk címével.
Az memóriafoglalónak lehet tippet adni egy korábban lefoglalt blokkal, hogy merrefelé foglaljon blokkot.
A standard memóriafoglaló a new
operátort használja az allokációhoz.
deallocate metódus – delete
void deallocate(pointer p, size_type n);
Megadott mutató által mutatott területről felszabadít n
elemet.
Az n
-nek pont annyi elemnek kell lennie, mint amennyit lefoglaltunk.
Standard memóriafoglaló esetén a delete
operátorral lesz felszabadítva a blokk.
Az egyes elemekre nem hívódik destruktor!
max_size – az elméletileg legnagyobb lefoglalható blokk mérete
size_type max_size() const throw();
Visszatér az elméletben lehetségesen lefoglalható legtöbb elem számával. A függvénynek nem sok haszna van, mert nem garantálja, hogy a visszatérési értékként kapott számú elemet le is lehet foglalni.
construct – másoló konstruktor hívása az a megadott mutatónál
void construct(pointer p, const_reference val);
A p
mutatón lévő területen, hívja a másoló konstruktort val
értékkel.
Standard memóriafoglaló esetében ez lényegében a következő helyi new operátor hívása: new ((void*)p) T (val);
destroy – destruktor hívása
void destroy (pointer p);
Meghívja a destruktort a megadott mutatón. Standard memóriafoglaló esetében ez lényegében egy destruktorhívás: ((T*)p)->~T();
.
auto_ptr
template <class X> class auto_ptr;
Ez egy olyan objektum, amely magába zár a mutatót, és felszabadítja azt a delete
operátorral, amikor az objektum megsemmisül.
Konstruktorai
explicit auto_ptr (X* p=0) throw(); auto_ptr (auto_ptr& a) throw(); template<class Y> auto_ptr (auto_ptr<Y>& a) throw(); auto_ptr (auto_ptr_ref<X> r) throw();
A p
egy mutató, amelyet az objektum átvesz.
Az a
egy másik auto_ptr
, amelytől átveszi a mutatót az éppen készített objektum (szóval az már nem tárolja azt.)
Az r
egy auto_ptr_ref
amely egy referencia egy auto_ptr osztályra.
Destruktor
~auto_ptr() throw();
Felszabadítja a memóriát, melyre a tárolt mutató mutat (egy delete
operátorral).
get metódus
X* get() const throw();
Lekérdezi a tárolt mutató értékét.
A * operátor
X& operator*() const throw();
Hagyományos mutatókhoz hasonlóan használható a * operátor ezen osztály példányain.
A -> operátor
X* operator->() const throw();
A -> operátor is használható ezen az osztályon ugyanúgy, mint sima mutatókon.
Az = operátor
auto_ptr& operator= (auto_ptr& a) throw(); template <class Y> auto_ptr& operator= (auto_ptr<Y>& a) throw(); auto_ptr& operator= (auto_ptr_ref<X> r) throw();
Ez az operátor nem másol, hanem mozgat, a jobb oldalán álló auto_ptr
-ben lévő mutató
nullázva lesz, miután át lett másolva a bal oldalon állóba. Ha a baloldalon álló objektum már tárol egy mutatót,
akkor az fel lesz szabadítva a delete
operátorral.
release metódus – tárolt mutató elengedése
X* release() throw();
Elengedi a tárolt mutatót, és visszatér vele. A művelet után a tárolt mutató értéke NULL lesz. A mutatott objektum nem fog felszabadulni.
reset metódus – tárolt mutatón tárolt adat felszabadítása
void reset (X* p=0) throw();
Felszabadítja a tárolt mutató által mutatott objektumot a delete
operátorral, és
lecseréli a p
mutatóra.
Konvertáló operátorok
template <class Y> operator auto_ptr_ref<Y>() throw(); template <class Y> operator auto_ptr<Y>() throw();
Ezek a konvertáló operátorok arra jók, hogy egy olyan auto_ptr
vagy auto_ptr_ref
objektumot
csináljuk, amely más típusú adatra mutat.
auto_ptr_ref osztály
template <class Y> struct auto_ptr_ref;
Ebben semmi érdekes nincs, ez csak egy osztály, amelyben auto_ptr
-re mutató referenciát lehet tárolni.
Inicializálatlan memória kezelése
raw_storage_iterator osztály
template <class OutputIterator, class T> class raw_storage_iterator : public iterator<output_iterator_tag,void,void,void,void> { protected: OutputIterator iter; public: explicit raw_storage_iterator (OutputIterator x) : iter(x) {} raw_storage_iterator<OutputIterator,T>& operator* () { return *this; } raw_storage_iterator<OutputIterator,T>& operator= (const T& element) { new (static_cast<void*>(&*iter)) T (element); return *this; } raw_storage_iterator<OutputIterator,T>& operator++ () { ++iter; return *this; } raw_storage_iterator<OutputIterator,T> operator++ (int) { raw_storage_iterator<OutputIterator,T> tmp = *this; ++iter; return tmp; } };
Ez egy OutputIterator
(kimeneti bejáró), amely inicializálatlan területen működik: íráskor ott helyben konstruálja meg az objektumokat.
A hagyományos kimeneti bejáró már létező objektumokon működik.
Ideiglenes pufferek függvényei
get_temporary_buffer függvény – lényegében malloc
template <class T> pair <T*,ptrdiff_t> get_temporary_buffer ( ptrdiff_t n );
Egyfajta C++-os malloc
, mellyel megadott számú és típusú elemnek foglalhatunk memóriát.
Ha sikerül a lefoglalás egy pair
-rel tér vissza, melynek első eleme egy mutató a lefoglalt bufferre, a második pedig a ténylegesen lefoglalt elemeknek a száma.
Ha nem sikerül a lefoglalás, akkor NULL-ra lesz állítva a mutató, és 0-ra a lefoglalt elemek száma. Semmi inicializálást nem csinál.
return_temporary_buffer függvény – lényegében free
template <class T> void return_temporary_buffer (T* p);
Egyfajta C++-os free
. A get_temporary_buffer
függvénnyel kapott memória visszaadása.
Specializált algoritmusok
uninitialized_copy függvény – másolás inicializálatlan területre
template <class InputIterator, class ForwardIterator> ForwardIterator uninitialized_copy ( InputIterator first, InputIterator last, ForwardIterator result );
Lényegében ugyanazt csinálja, mint a sima copy
,
csak ez ott helyben konstruálja meg az objektumokat (másoló konstruktorral), ahelyett hogy az egészet csak úgy átmásolná (az = operátorral).
Nyilván ez működik inicializálatlan területen is, a sima copy
nem.
uninitialized_fill függvény – inicializálatlan terület kitöltése
template <class ForwardIterator, class T> void uninitialized_fill ( ForwardIterator first, ForwardIterator last, const T& x );
Ugyanazt csinálja, mint a fill
algoritmus, csak ez inicializálatlan területen másoló konstruktorral hozza létre az objektumokat,
a sima fill
az =
operátor segítségével.
uninitialized_fill_n függvény
template <class ForwardIterator, class Size, class T> void uninitialized_fill_n (ForwardIterator first, Size n, const T& x);
Ugyanazt csinálja, mint a fill_n
algoritmus, csak ez inicializálatlan területen másoló konstruktorral hozza létre az objektumokat,
a sima fill_n
az =
operátor segítségével.
A <new> fejléc
Ez a fejléc írja le a new
operátorral kapcsolatos dolgokat. Fontos tudni, hogy a
new
, new[]
, delete
és delete[]
operátorok ezen fejléc beszúrása nélkül is működik, viszont a kapcsolódó dolgok eléréséhez be kell szúrni ezt
a fejlécet.
Típusok
bad_alloc
Ez egy kivétel, amely az exception
osztályból származik, akkor dobják, ha az lefoglalás sikertelen volt.
new_handler
typedef void (*new_handler)();
Egy paraméter és visszatérési érték nélküli függvénytípus.
nothrow_t
Segédtípus, egy üres struktúra
Konstansok
nothrow
extern const nothrow_t nothrow;
Ez a konstans a kivételt nem dobó new
operátorhoz van, amelyet valahogy így kell használni:
new (nothrow) Típus(paraméterek)
Ez a new
operátor NULL mutatóval tér vissza, és nem fog kivételt dobni, ha sikertelen az allokáció.
Függvények
set_new_handler – sikertelen new operátor hívása esetén hívódik
new_handler set_new_handler (new_handler new_p) throw();
Beállít egy handlert, amely akkor hívódik, amikor a standard new
vagy new[]
operátor nem tudott sikeresen lefutni.
Visszatér a korábbi kezelőre mutató mutatóval.
Számsorozatokra alkalmazható algoritmusok
Ezek a <numeric> fejlécben vannak. Számokat tartalmazó tartományokra alkalmazhatók.
accumulate – elemek összegzése
template <class InputIterator, class T> T accumulate(InputIterator eleje, InputIterator vege, T kezdo); template <class InputIterator, class T, class BinaryOperation> T accumulate(InputIterator eleje, InputIterator vege, T kezdo, BinaryOperation binaris_muvelet);
Megadott tartomány elemeit összegzi, megadott kezdőértéktől kezdve (kezdo
).
Az alapértelmezett algoritmus a +
operátort használja, de megadhatunk saját kétoperandusú műveletet is.
adjacent_difference – szomszédos elemek különbsége
template <class InputIterator, class OutputIterator> OutputIterator adjacent_difference ( InputIterator eleje, InputIterator vege, OutputIterator eredmeny ); template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator adjacent_difference ( InputIterator eleje, InputIterator vege, OutputIterator eredmeny, BinaryOperation binary_op );
A megadott tartomány szomszédos elemeinek a különbségét számolja ki, és az eredményt a megadott kimeneti bejáróhoz írja.
Az eredmény első eleme a kiindulási tartomány első eleme, a többi érték a tartomány adott eleme, és az azt megelőző elem különbsége.
Alapértelmezésben a -
operátort használja, de megadhatunk saját operátort is.
Példa: [1, 2, 4, 7, 11, 16] => [1, 1, 2, 3, 4, 5]
inner_product – skaláris szorzat, belső szorzat
template <class InputIterator1, class InputIterator2, class T> T inner_product ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, T init ); template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> T inner_product ( InputIterator1 eleje1, InputIterator1 vege1, InputIterator2 eleje2, T init, BinaryOperation1 osszeadas, BinaryOperation2 szorzas );
Két azonos hosszúságú listának a belső szorzatát állítja elő (azaz összeszorozza elemeiket páronként, és összeadja az eredményeket).
Az init-et használva kezdőértéknek. Alapértelmezésben a +
és *
műveletet használja, de lehet használni saját összeadás és szorzás műveleteket is.
Példa: [1, 2, 3] * [3, 4, 5] = 3 + 8 + 15 = 26
partial_sum – részösszegek listájának az előállítása
template <class InputIterator, class OutputIterator> OutputIterator partial_sum ( InputIterator eleje, InputIterator vege, OutputIterator eredmeny ); template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator partial_sum ( InputIterator eleje, InputIterator vege, OutputIterator eredmeny, BinaryOperation muvelet );
A megadott tartomány elemeit összeadogatja a részeredményeket a megadott bejáróhoz írja ki.
Alapértelmezésben a +
műveletet használja, de megadhatunk sajátot is.
[1, 2, 3, 4] => [1, 3, 6, 10]
Standard kivételek
Ez az <stdexcept>
fejlécben van.
A szabvány a következő osztályhierarchiát definiálja a kivételekből:
-
logic_error
- domain_error
- invalid_argument
- length_error
- out_of_range
-
runtime_error
- range_error
- overflow_error
- underflow_error
Minden standard függvénynél adott, hogy milyen kivételeket dobhat.
Futás közbeni típusazonosítás
A <typeinfo>
fejléc deklarálja azt a struktúrát,
amelyet a typeid
operátor állít elő.
class type_info { public: virtual ~type_info(); bool operator== (const type_info& rhs) const; bool operator!= (const type_info& rhs) const; bool before (const type_info& rhs) const; const char* name() const; private: type_info (const type_info& rhs); type_info& operator= (const type_info& rhs); };
A konstruktora és a másoló konstruktora privát, mert ezt csak a typeid
operátor hozhatja létre.
A name
metódusával lehet lekérdezni a típus nevét. A before
metódus igazat ad, ha a típus
illesztési sorrendben megelőz egy másik típust (ezt lehet használni < operátorként ha adatszerkezetben akarunk típusokat tárolni).
bad_cast kivétel
Ezt akkor dobja, amikor a dynamic_cast
nem tudja átkonvertálni a referenciát (mutató esetén NULL-t ad az az operátor)
bad_typeid kivétel
Ezt akkor dobja, amikor a typeid
operátor, ha NULL mutatót adunk neki.
Az utility fejléc
Pár hasznos apróság van ebben a fejlécben.
pair
Ezzel a sablonnal lehet két dolgot egybe pakolni, korábban már előkerült, megadása:
template <class T1, class T2> struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() : first(T1()), second(T2()) {} pair(const T1& x, const T2& y) : first(x), second(y) {} template <class U, class V> pair (const pair<U,V> &p) : first(p.first), second(p.second) { } }
A globális összehasonlító operátorok is értelmezve vannak rajta: először az első értéket hasonlítja össze, ha az egyenlő, akkor a másodikat. Ha mindkettő egyenlő, akkor két pár egyenlőnek tekintendő.
make_pair függvény – pár gyártása
template <class T1, class T2> pair<T1,T2> make_pair(T1 x, T2 y);
Egy pair példányt hoz létre. Semmi extra nincs benne, csak egyszerűbb make_pair(1, 2)
-t írni, mint std::pair<int,int>(1, 2)
-t.
rel_ops névtér
namespace rel_ops { template <class T> bool operator!= (const T&, const T&); template <class T> bool operator> (const T&, const T&); template <class T> bool operator<= (const T&, const T&); template <class T> bool operator>= (const T&, const T&); }
Ebben a névtérben az == és az < operátor segítségével definiáljuk a többit, így saját típushoz elég csak ezt a kettőt definiálni. A többi ezen névtér használatával elérhetővé válik.
valarray
Ezt a <valarray>
fejlécben találjuk. Ezt vektoros számítások elvégzésére találták ki, azonban nem nagyon használatos, illetve vannak jobb erre szakosodott függvénytárak is már erre.
Alap sablonok
A legtöbb iostream és más osztályoknak léteznek ún. alapsablonjaik melyekkel a funkcióik általánosíthatók más adattípusokra is, a következő táblázatban gyűjtöttem össze ezeket:
Alap sablon | Példánya | Példány kifejtve |
---|---|---|
basic_ios<charT, traits> | ios | basic_ios<char, char_traits<char> > |
basic_istream<charT, traits> | istream | basic_istream<char, char_traits<char> > |
basic_ostream<charT, traits> | ostream | basic_ostream<char, char_traits<char> > |
basic_iostream<charT, traits> | iostream | basic_iostream<char, char_traits<char> > |
basic_streambuf<charT, traits> | streambuf | basic_streambuf<char, char_traits<char> > |
basic_ifstream<charT, traits> | ifstream | basic_ifstream<char, char_traits<char> > |
basic_fstream<charT, traits> | fstream | basic_fstream<char, char_traits<char> > |
basic_ofstream<charT, traits> | ofstream | basic_ofstream<char, char_traits<char> > |
basic_filebuf<charT, traits> | filebuf | basic_filebuf<char, char_traits<char> > |
basic_istringstream<charT, traits> | istringstream | basic_istringstream<char, char_traits<char> > |
basic_ostringstream<charT, traits> | ostringstream | basic_ostringstream<char, char_traits<char> > |
basic_stringstream<charT, traits> | stringstream | basic_stringstream<char, char_traits<char> > |
basic_stringbuf<charT, traits> | stringbuf | basic_stringbuf<char, char_traits<char> > |
basic_ios<charT, traits> | wios | basic_ios<char, char_traits<wchar_t> > |
basic_istream<charT, traits> | wistream | basic_istream<char, char_traits<wchar_t> > |
basic_ostream<charT, traits> | wostream | basic_ostream<char, char_traits<wchar_t> > |
basic_iostream<charT, traits> | wiostream | basic_iostream<char, char_traits<wchar_t> > |
basic_streambuf<charT, traits> | wstreambuf | basic_streambuf<char, char_traits<wchar_t> > |
basic_ifstream<charT, traits> | wifstream | basic_ifstream<char, char_traits<wchar_t> > |
basic_fstream<charT, traits> | wfstream | basic_fstream<char, char_traits<wchar_t> > |
basic_ofstream<charT, traits> | wofstream | basic_ofstream<char, char_traits<wchar_t> > |
basic_filebuf<charT, traits> | wfilebuf | basic_filebuf<char, char_traits<wchar_t> > |
basic_istringstream<charT, traits> | wistringstream | basic_istringstream<char, char_traits<wchar_t> > |
basic_ostringstream<charT, traits> | wostringstream | basic_ostringstream<char, char_traits<wchar_t> > |
basic_stringstream<charT, traits> | wstringstream | basic_stringstream<char, char_traits<wchar_t> > |
basic_stringbuf<charT, traits> | wstringbuf | basic_stringbuf<char, char_traits<wchar_t> > |
basic_string<charT> | string | basic_string<char> |
basic_string<charT> | wstring | basic_string<wchar_t> |
Látható, hogy az ios_base
kivételével az összes IOStream osztálynak van egy „basic_” előtagos változata, illetve a string osztálynak még.
Hasonlóan létezik wcin
, wcout
, wcerr
, wclog
, amelyek wchar_t
-vel működnek a char
helyett (ld. IOStream objektumok).