Beruflich Dokumente
Kultur Dokumente
A C++11 NYELV
J LEHETSGEINEK
TTEKINTSE
Tth Bertalan:
2013
Tartalom
Bevezets ............................................................................................................................................ 5
Nhny hasznos hivatkozs................................................................................................................. 5
1 Vltozsok a C++ nyelv alapelemei szintjn ..................................................................................... 6
1.1 j, illetve mdostott rtelm C++ kulcsszavak ........................................................................ 6
1.2 j egsz tpusok......................................................................................................................... 6
1.3 j lebegpontos rtkek ........................................................................................................... 7
1.4 Szigoran tpusos felsorolsok enum osztlyok ..................................................................... 7
1.5 A nullptr s a nullptr_t .............................................................................................................. 8
1.6 Sztring literlok.......................................................................................................................... 8
1.6.1 Nyers (raw) sztring literlok ............................................................................................... 8
1.7 Felhasznl ltal definilt literlok............................................................................................ 9
1.8 Fordts idej konstans kifejezsek (constexpr) ....................................................................... 9
1.8.1 A static_assert kulcssz .................................................................................................... 10
1.9 Kivtelek tovbbtsnak tiltsa (noexcept) ........................................................................... 10
1.10 Vltozk memriahatrra igaztsa ...................................................................................... 11
2 j, szokatlan nyelvi megoldsok .................................................................................................... 12
2.1 Automatikus tpus-meghatrozs ........................................................................................... 12
2.2 Jobbrtk hivatkozsok (&&) .................................................................................................. 13
2.3 Adatok thelyezse (forward s a move) ................................................................................ 14
2.4 Okos (smart) mutatk .......................................................................................................... 15
2.5 Egysges inicializls ............................................................................................................... 17
2.6 Tartomnyalap for ciklus, a begin s az end hvsok ............................................................ 18
2.7 - lambda kifejezsek (fggvnyek) ....................................................................................... 20
2.8 Programkd prhuzamos futtatsa......................................................................................... 22
2.8.1 Aszinkron kdvgrehajts ................................................................................................ 23
2.8.2 Szlak futtatsa ................................................................................................................ 24
2.8.3 Szlak szinkronizlsa kizrssal ...................................................................................... 26
2.8.4 Szlak szinkronizlsa atomi vltozkkal ......................................................................... 27
3. Vltozsok az osztlyok s a sablonok krben ............................................................................ 29
3.1 Konstruktorok deleglsa, adattagok inicializlsa, sizeof adattagra ..................................... 29
3.2 Opertorfggvnyek explicit tpus-talaktssal ..................................................................... 30
3.3 Az override s a final mdostk ............................................................................................. 30
3.4 A delete s a default tagfgvnyek ......................................................................................... 32
3.5 Korltozsok nlkli union tpus ............................................................................................. 32
3.6 Sablonok s a C++11 ................................................................................................................ 33
3.6.1 Szintaxis ............................................................................................................................ 33
3.6.2 Kls sablonok.................................................................................................................. 33
3.6.3 Sablon lnevek (template alias) ....................................................................................... 34
3.6.4 Sablonok vltoz hosszsg argumentumlistval (variadic templates)......................... 35
3.6.5 Htravetett visszatrsi tpus (suffix return types) .......................................................... 37
4. A C++11 knyvtr jdonsgai ........................................................................................................ 38
4.1 j fggvnyek s tagfggvnyek a C++ knyvtrban .............................................................. 38
4.1.1 C-sztring tartalmnak szmm alaktsa .......................................................................... 38
4.1.2 A string tpus s a numerikus adatok kztti talaktsok ............................................. 39
4.1.3 Unicode karakterek s sztringek talaktsa .................................................................... 39
4.1.4 j matematikai fggvnyek.............................................................................................. 40
4.1.5 A bvtett complex osztlysablon .................................................................................... 41
4.1.6 Fordts idej racionlis aritmetika .................................................................................. 41
4.2 Vletlen szmok ellltsa ..................................................................................................... 43
Mdostott kulcsszavak
auto
default
delete
export
using
signed char
unsigned char
short
unsigned short
int
unsigned
long long
unsigned long long
Az rtkhatr makrk INTn_MIN, INTn_MAX, UINTn_MIN, UINTn_MAX, ahol n rtke 8,16, 32 vagy
64 lehet.
1.3 j lebegpontos rtkek
A C++11 szabvny a float, double s a long double lebegpontos tpusok krt nem bvti, azonban a
lebegpontos rtkek terleten j eszkzket knl a programozk szmra. Egyrszt lehetsget
biztost a vgtelen (INFINITY) s a nem szm (NAN) rtkek kezelsre. Msrszt pedig a lebegpontos konstans rtkeket pontosabban adhatjuk meg hexadecimlis formban (a mantisszt 16-os,
mg a p/P bet utn a 2 kitevjt 10-es szmrendszerben kell szerepeltetnnk.) Pldul, a 0x1.004p7
decimlis rtke 128.125, a 0x1Ab2P2 konstans pedig 27336.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << 0x1.ap+0f << endl;
cout << 0x1.0P+10 << endl;
cout << 0x0.C90FDAA22168CP2 << endl;
cout << "1/0.0 = " << 1/0.0 << endl;
cout << "-1/0.0 = " << -1/0.0 << endl;
cout << "0.0/0.0 = " << 0.0/0.0 << endl;
cout << "sqrt(-1.0) = " << sqrt(-1.0) << endl;
cout << "INFINITY/INFINITY = " << INFINITY/INFINITY << endl;
}
1.625
1024
3.14159
1/0.0 = inf
-1/0.0 = -inf
0.0/0.0 = nan
sqrt(-1.0) = nan
INFINITY/INFINITY = nan
Az elemek tpusaknt tetszleges eljeles vagy eljel nlkli egsz tpust szerepeltethetnk.
Az els a szoksos " " kztti szveg, ami const char tmbknt troldik, 0-s bjttal a vgn.
A msodik az L"..." jellssel hasznlhat,melynek eredmnyeknt egy const wchar_t tmb
jn ltre, 0 rtk utols elemmel. (Emlkeztetl a wchar_t a szles karakterek tpusa.)
A szles sztringekben hagyomnyos, rgztett 16 bit kdolssal trolhatunk Unicode szveget, azonban nem alkalmasak nagyobb kdmret szvegek trolsra.
A C++11-ben hrom jabb Unicode kdols tmogatsa is megtallhat: UTF-8, UTF-16 s UTF-32. Az
UTF-32 a karakter kdjt mindig 32 biten trolja, mg az UTF-16 1 vagy 2 egysget, az UTF-8 pedig 1-4
egysget hasznl erre a clra.
A C++ programokban a karakterkdolssal sszefgg kaotikus llapotok valamelyest cskkentek,
azonban a felhasznls tovbbi kvnnivalkat hagy maga utn. Az albbi tblzatban foglaltuk ssze
a lehetsgeket:
karakter tpus karakter konstans
norml karakterek
szles karakterek
UTF-8 kdols
UTF-16 kdols
UTF-32 kdols
char
wchar_t
char
char16_t
char32_t
'A', '\x41'
L'A', L'\x0041'
u'A', u'\u0041'
U'A', U'\U00000041'
sztring tpus
string
wstring
string
u16string
u32string
A
(violinkulcs: U+1D11E) s a (pi: U+03C0) jelet tartalmaz szvegek trolsa karakter tmbkben:
wchar_t cpw[] = L"violinkulcs : \U0001D11E, pi: \u03C0";
char cpu8[] = u8"violinkulcs : \U0001D11E, pi: \u03C0";
char16_t cpu16[] = u"violinkulcs : \U0001D11E, pi: \u03C0";
char32_t cpu32[] = U"violinkulcs : \U0001D11E, pi: \u03C0";
s sztring tpusokban:
wstring sw = L"violinkulcs : \U0001D11E, pi: \u03C0";
string s8 = u8"violinkulcs : \U0001D11E, pi: \u03C0";
u16string s16 = u"violinkulcs : \U0001D11E, pi: \u03C0";
u32string s32 = U"violinkulcs : \U0001D11E, pi: \u03C0";
Els sor.
msodik sor.
utols sor.
Els sor.\nmsodik sor.\nutols sor.\n
Az egsz s lebegpontos konstans rtkek feldolgozst szmknt, illetve karaktersorozatknt egyarnt elvgezhetjk:
inline double operator"" _fok (long double fok) {
return fok*3.14159265/180;
}
double szog = 90.0_fok; // szog = 1.570796325
unsigned operator "" B(const char* bs) {
unsigned b=0;
for (int i=0; bs[i]; i++)
b = b*2 + (bs[i]=='1');
return b;
};
int maszk = 110011B; // maszk = 51
Karakter s sztring literlok esetn az albbi formk hasznlhatk, ahol a chtpus a klnbz kartertpusokat jelli (char, wchat_t, char16_t, char32_t).
tpus operator"" uttag(char c) { }
tpus operator"" uttag(const chtpus* str, size_t strhossz) {
is j
is j
is j
is j
A fordt kirtkeli a konstans kifejezst, s megjelenti a sztring zenetet, ha a kirtkels eredmnye hamis. A fenti pldban ellenrizhetjk, hogy a pi konstans rtke 3 s 4 kz esik-e:
const double pi=1.14159265;
static_assert(pi>=3 && pi<=4, "Nem j az rtk");
A kvetkez fordtsi hibazenetet kapjuk: error: static assertion failed: Nem j az rtk.
1.9 Kivtelek tovbbtsnak tiltsa (noexcept)
A C++11 szabvny szerint a fggvnyekben keletkez kivtelek tovbbtsrl (a hv fel) j mdon
is dnthetnk. A fggvnyfejben a noexcept (vagy noexcept(true)) elrst megadva, a kivtelek nem
tovbbtdnak a fggvnybl, hatsukra a program futsa megszakad. Az elrst elhagyva, illetve a
noexcept(false) formban hasznlva, a kivtelek tovbbtdnak.
A noexcept kulcssz utn zrjelben egy fordts idej kifejezs llhat, amely 0 vagy nem 0 rtke
vezrli az elrs mkdst. Ebben a kifejezsben hasznlhatjuk a noexcept() opertort, amely true
rtkkel tr vissza, ha az argumentuma nem tovbbt kivteleket.
// Engedlyezi a kivtelek tovbbtst amennyiben a vector::operator[]
// is engedlyezi
void Ellenoriz(const vector<int>& v) noexcept(noexcept(v[0])) {
if (v[0] > 0) cout << "OK\n";
}
// Engedlyezi a kivtelek tovbbtst amennyiben a vector::push_back(T)
// is engedlyezi
void HozzaAd(vector<int>& v, const int elem)
noexcept(noexcept(v.push_back(elem))) {
v.push_back(elem);
}
// Nem tovbbtdik kivtel
int Meret(const vector<int>& v) noexcept {
return v.size();
}
10
11
// darab - int
// pi - double
// p - int *
Az auto kulcsszval hagyomnyos fggvnyeket nem definilhatunk, azonban az j visszatrsi szintaxissal mr alkalmazhatjuk:
auto Osszead(int a, double b) -> int {
return a+b;
}
12
Ezen a helyzeten vltoztatott a C++11, ahol a hivatkozsok ltalnostsaknt tekinthetnk a && opertorra:
int&&
int&&
int&&
const
xr = 23;
yr = f();
zr = a;
int&& wr = 123;
// de!
auto&& dr = a;
A jobbrtk hivatkozsok bevezetsnek igazi rtelmt a fggvnyek paramterezsben s a kvetkez rszben bemutatsra kerl thelyezs (move) szemantikban talljuk meg.
Pldaknt tekintsk az albbi kt tlterhelt fggvnyvltozatot:
const int& f(const int& a) {
return a;
}
int&& f(int&& a) {
return a+0;
}
// f(int&& a)
int& y = x;
e = f(y);
int&& z = 7;
e = f(z);
e= f(x+y*z);
// f(int&& a)
13
A move() fggvny sokkal szlesebb krben hasznlhatjuk, elssorban nagyobb mret objektumok
esetn.
int a[5] = {2, 3, 1, 7, 9};
vector<int> v1(a, a+5);
vector<int> v2 = v1;
vector<int> v3(a, a+5);
vector<int> v4 = move(v3);
// msols
// thelyezs
14
{}
// copy konstruktor
DTomb (const DTomb& b) : p(new int[b.db]), db(b.db) {
for (int i = 0; i < db; ++i) p[i]=b.p[i];
}
DTomb (DTomb&& b) : p(b.p), db(b.db) { // move konstruktor
b.db = 0; b.p = nullptr;
}
DTomb& operator=(const DTomb& b) { // copy opertor
delete[] p;
db = b.db;
p = new int [db];
for (int i = 0; i < db; ++i) p[i]=b.p[i];
return *this;
}
DTomb& operator=(DTomb&& b) { // move opertor
delete[] p;
p = b.p; db = b.db;
b.db = 0; b.p = nullptr;
return *this;
}
~DTomb() { delete[] p; }
private:
int *p, db;
};
int main() {
DTomb a, b, c;
DTomb d = a, e(b);
DTomb f=move(a), g(move(b));
c = e;
c = move(e);
}
//
//
//
//
msol konstruktor
thelyez konstruktor
msol opertor
thelyez opertor
15
// p1 a Pelda tulajdonosa
{
unique_ptr<Pelda> p2(move(p1)); // p2 lett a Pelda tulajdonosa
KulsoFv(*p2);
p1 = move(p2); // jra p1 a Pelda tulajdonosa
cout << "p2 trlse ...\n";
}
if (p1) {
p1->TagFv();
cout << p1.get()->a << endl;
}
// a Pelda objektum megszntetse
}
16
A kezdrtk-ads fenti mdja termszetesen ms, akr egyrtk vltozkkal is sikeresen alkalmazhat. Kln felhvjuk a figyelmet a dinamikus helyfoglals tmb inicializlsra:
int main() {
double b {};
// a tpus alaprtkvel inicializl: 0.0
char ct[7] {};
// ct minden eleme '\0' lesz
float *fp {};
// a nullptr rtket veszi fel
int a {123};
string s {"C++11"};
long *p = new long[3] {12,23,34};
delete []p;
struct {
int kor;
string nev;
} diak {9, "Ivn"};
}
Sajt kszts osztlyainkat egy initializer_list<> tpus paramtert fogad konstruktorral felkszthetjk az inicializl lista feldolgozsra.
17
ahol a tartomny_kifejezs helyn olyan kifejezs llhat, melyre a szintn jonnan bevezetett begin()
s end() fggvnyek egyrtelmen azonostjk (mutatkkal/itertorokkal) a tartomny elejt s vgt.
A ciklus futsa sorn egy mutat/itertor vgigmegy a fentiekben kijellt tartomnyon, s minden
lpsben az elem_deklarciban megadott vltozn keresztl rhetjk el a meghivatkozott elemet.
Pldaknt vegyk a hagyomnyos (statikus) tmbket:
int a[] = {2, 7, 10, 11, 12, 23, 29, 30};
A tartomny_kifejezsben elssorban a mr ismert s az j STL trolkat hasznljuk, de alkalmazhatunk tmbket (array, valarray) s inicializl listkat is
vector <double> v = {1.2, 2.3, 3.5};
for (auto e : v) cout << e << " ";
array<double,3> ar = {1.2, 2.3, 3.5};
for (auto e : ar) cout << e << " ";
valarray<double> var = {1.2, 2.3, 3.5};
for (auto e : var) cout << e << " ";
for (auto e : { 12, 23, 34, 45} ) cout << e << " ";
Mint emltettk, a for ciklussal bejrt tartomny hatrait a begin s az end hvsokkal krdezi le a
fordt, amelyek osztlyok esetn a begin() s az end() tagfggvnyek hvst jelenti. Minkt fggvny ltalnostott mutatkkal (itertorokkal) tr vissza, melyek a trolt adatok elejre, illetve a vgt kvet pozcira hivatkoznak:
begin
18
end
A begin s az end sablonokat az STL kontnereivel is sikeresen alkalmazhatjuk, pldul az rtktmbbel (valarray):
#include <iostream>
#include <algorithm>
#include <valarray>
using namespace std;
int main() {
valarray<double> va {25, 9, 36, 4};
sort(begin(va), end(va));
for (auto e : va)
cout << e << ' '; cout << endl;
valarray<double> vb = sqrt(va);
for (auto e : vb)
cout << e << ' '; cout << endl;
cout << va.sum() << endl;
cout << vb.max() << endl;
va = va + vb;
for (auto e : va)
cout << e << ' '; cout << endl;
fill(begin(va), end(va), 0);
for (auto e : va)
cout << e << ' '; cout << endl;
}
// 4 9 25 36
// 2 3 5 6
// 74
// 6
// 6 12 30 42
// 0 0 0 0
19
A bevezet szgletes zrjelpr jelzi, hogy lamda (kifejezs) kvetkezik. Ez utn ll a fggvny trzse,
amely return utastsbl a fordt meghatrozza fggvny rtkt s tpust. Az utastst zr kerek
zrjelpr a fggvnyhvst jelenti.
Amennyiben paramterezni kvnjuk a lambdt, a fenti kt rsz kz egy hagyomnyos paramterlista is bekeldik:
int b = [] (int x, int y) { return x*y;} (12,23);
Amennyiben egy lambda fggvnyt tbbszr szeretnnk hvni, hozzrendelhetjk egy fggvnymutathoz. Az albbi pldban egy tabellz fggvny argumentumaknt hasznlunk lambdkat:
#include <iostream>
#include <cmath>
using namespace std;
void Tabellaz(double a, double b, double dx, double(*pfv)(double))
{
for (double x = a; x <= b; x += dx)
cout << x << "\t" << pfv(x) << endl;
}
double (*fvptr1)(double) = [](double x)-> double {
return x*sqrt(x);
};
auto fvptr2 = [](double x)-> double {return log(x)*sqrt(x);};
int main() {
Tabellaz(1, 2, 0.2, [](double x) {return x*x;});
Tabellaz(2, 3, 0.1, fvptr1);
Tabellaz(3, 4, 0.2, fvptr2);
}
A lambda fggvnyek legfontosabb alkalmazsi terlete az STL algoritmusok hvsa. Az albbi utastsok a vector s az algorithm fejllomnyok beptse utn mkdkpesek:
vector <int> adatok = { 1, 1, 2, 3, 5, 8, 13, 21 };
int db= count_if(begin(adatok), end(adatok), [](int e){return e%2;} );
cout << "Pratlan elemek szma: " << db << endl;
for_each(begin(adatok), end(adatok), [](int& e) { e = 2*e;} );
sort(begin(adatok), end(adatok), [](int e1, int e2) { return e1>e2;} );
for_each(begin(adatok), end(adatok), [](int e) { cout << e << " ";} );
Elszr megszmlljuk az adatok vektor pratlan elemeit, majd minden elemet a dupljra nvelnk,
cskken sorrendben rendezzk a vektort, vgl pedig megjelentjk az elemeket.
20
A loklis, nem statikus fggvnyvltozk, illetve az osztly adattagjai esetn intzkedhetnk az elrs
mdjrl. Amennyiben a fenti pldban az a s b loklis vltozk, a velk azonos hatkrben megadott lambda a kvetkezkppen mdosul:
int main() {
double a = 3.14159265;
int b = 11;
double x = [a,b] () { return a+b;} ();
cout << x << endl;
}
A lambdt s az elrt vltozkat egytt szoks bezrsnak (closure) nevezni, mg a felhasznlt vltozkra, mint elkapott (captured) vltozkra hivatkozunk. A vltozkat rtkk szerint s hivatkozsukkal egyarnt elkaphatjuk, az albbi pldkban bemutatott mdon:
[]
[=]
[&]
[a, b]
[a, &b]
[=, &b]
[&, a]
[this]
A fordt alaphelyzetben nem engedi az rtk szerint elkapott vltozk rtknek mdostst. Ha
azonban a fggvny trzse eltt megadjuk a mutable kulcsszt, a mdosts elvgezhet, azonban
rvnyessge a lambdra korltozdik.
int main() {
int x = 7, y = 12;
int z = [=] () mutable { ++x, ++y; return x*y;} ();
cout << x << y << z << endl; // 7 12 104
}
21
A C++11 nyelvben bevezetett function<> sablon (functional fejllomny) nagyban segti a lambda
fggvnyek hasznlatt. Segtsgvel a tabellz programunk jval olvashatbb formt lt:
#include <iostream>
#include <cmath>
#include <functional>
using namespace std;
void Tabellaz(double a, double b, double dx,
function<double(double)> fv) {
for (double x = a; x <= b; x += dx)
cout << x << "\t" << fv(x) << endl;
}
function<double(double)> fv1 = [](double x)-> double {
return x*sqrt(x);
};
function<double(double)> fv2 = [](double x)-> double
{return log(x)*sqrt(x);};
int main() {
Tabellaz(1, 2, 0.2, [](double x) {return x*x;});
Tabellaz(2, 3, 0.1, fv1);
Tabellaz(3, 4, 0.2, fv2);
}
22
Az async() sablon msik vltozatban az els argumentum a futtats mdjt hatrozza meg:
auto fv = async(launch::deferred, Kiir, "async: ");
main:
async:
main:
async:
async:
main:
async:
main:
async:
main:
async:
async:
main:
async:
async:
main:
0
0
1
1
2
2
3
3
4
4
5
6
5
7
8
6
A fenti pldban, a fszlban (main()) s az aszinkron szlban (Kiir()) egy-egy for ciklus fut, melyek
futsi eredmnynek els pr sora a jobb oldali oszlopban lthat. Az aszinkron kd befejezst a
future< > osztlysablon wait() tagfggvnyvel vrhatjuk meg.
23
vrakozik...
timeout
timeout
timeout
ksz
az eredmny 123
24
main() programszl
programszl
ltrehozsa
programszl.join()
main() programszl
thread:
main:
main:
thread:
thread:
thread:
thread:
thread:
thread:
main:
thread:
thread:
main:
main:
main:
main:
main:
main:
main:
0
0
1
1
2
3
4
5
6
2
7
8
3
4
5
6
7
8
9
Az aktulis szlra (a szlat megvalst fggvnyen bell) a this_thread nvtr fggvnyeivel is hivatkozhatunk:
lekrdezhetjk a szl azonostjt
get_id(),
javasolhatjuk, hogy vezrls a szltl addjon t ms szlakhoz: yield(),
megadott ideig felfggeszthetjk a szl futst:
sleep_for(idtartam),
#include <chrono>
#include <thread>
using namespace std::chrono;
int main() {
std::this_thread::sleep_for(seconds(10));
}
sleep_until(idpont).
#include <chrono>
#include <thread>
using namespace std::chrono;
int main() {
std::this_thread::sleep_until(system_clock::now() + seconds(10));
}
25
mutex nlkl:
A: 0
B: 0
B: 1
B: 2
B: 3
B: 4
C: 0
C: 1
C: 2
A: 1
A: 2
A: 3
A: 4
C: 3
C: 4
mutex-szel:
A: 0
B: 0
C: 0
A: 1
B: 1
C: 1
A: 2
B: 2
C: 2
A: 3
B: 3
C: 3
A: 4
B: 4
C: 4
A kizrs elvgzsre tbb, a <mutex> fejllomnyban deklarlt osztly kzl is vlaszthatunk, melyek neve utal a felhasznlsi mdjukra: mutex, recursive_mutex, timed_mutex,
recursive_timed_mutex. Mindegyik osztly biztostja szmunkra a lock(), try_lock() s az unlock()
tagfggvnyeket.
mutex m;
if (m.try_lock() == true) {
cout << " Megtrtnt a kizrs" << endl;
m.unlock();
} else
cout << "Sikertelen kizrs" << endl;
A rekurzv mutex-et akkor hasznljuk, ha egy szlban tbb kizrs is elfordul. Norml kizrs (mutex)
esetn az ilyen szlak nem tudjk befejezni a futsukat (elll deadlock llapot). Az idztett kizr
objektumokkal adott ideig try_lock_for() vagy adott idpontig try_lock_until () prblkozhatunk a
kizrssal.
Tovbbi lehetsget biztost a lock_guard<> osztlysablon hasznlata, melynek konstruktorban jn
ltre a kizrs, mg a destruktorban automatikusan meg is sznik az.
int n = 0;
mutex n_mutex;
void BiztonsagosLeptetes() {
lock_guard<mutex> kizaras(n_mutex);
++n;
}
26
Az utols, tbb szlat futtat pldban a szlakkal kt nagy vektor skalris szorzatt szmoljuk, felosztva a tmb elemeit a szlak kztt:
#include <iostream>
#include <thread>
#include <vector>
#include <atomic>
using namespace std;
atomic<int> eredmeny(0);
void SkalarSzorzat(const vector<int> &v1, const vector<int> &v2,
int kezdo, int vegso) {
int reszOsszeg = 0;
for(int i = kezdo; i < vegso; ++i) {
reszOsszeg += v1[i] * v2[i];
}
eredmeny += reszOsszeg;
}
int main() {
const int elemszam =100000;
const int szalszam = 5;
vector<thread> szalak;
27
28
Ez a megolds kell odafigyelst ignyel, hisz nem ajnlott rekurzv konstruktorhvsba keverednnk.
Nem tl lnyeges jdonsg, azonban rdemes tudni rla, hogy ezentl a sizeof mvelet az osztlyok
adattagjaira is elvgezhet, az osztlyok pldnyostsa nlkl. Ugyancsak ritkn hasznlt megoldsknt a C++11 biztostja, hogy az osztlyok nem statikus s nem konstans adattagjait kezdrtkkel
lssuk el az osztlydefincin bell.
#include <iostream>
using namespace std;
class Adattar {
private:
double d=12;
public:
long b=123;
char v[7] = {'O', 'O', '\0'};
void Kiir() {
cout << sizeof(Adattar::d) << endl; // 8
}
29
// 4
// 7
// 4
int main() {
Komplex a(3,4);
Komplex b = 123.0;
double x = a;
double y = b;
int c = Komplex(123);
}
30
// B::fv()
// B::fv()
Amennyiben a D osztly int tpus paramterrel definilja a D::fv() tagfggvnyt, a msodik hvskor
a D-beli fv() aktivizldik.
Az jonnan bevezetett override mdostval jelezhetjk a fordtnak, hogy virtulis fggvnyt szeretnnk jradefinilni. Ha azonban ennek felttelei nem llnak fenn (pl. eltr paramtertpusok),
fordtsi hibt kapunk.
class D : public B {
public:
void fv(long) override {cout << "D::fv()" << endl;}
};
A final mdostval pedig pp ellenkezleg, megakadlyozhatjuk az adott virtulis fggvny lecserlst a szrmaztatott osztlyokban:
class B {
public:
virtual void fv(int) final
};
// B::fv()
// D::fv()
31
// C a; ok
// C b(c); ok
// C c(move(b)); nem ok
// b = a; ok
// a = move(c); nem ok
A C++ osztlyokhoz osztlyszint opertor-fggvnyeket (&, *, ->, ->*, new, delete) definil a fordt,
melyek hasznlatt meg is tilthatjuk. Az albbi pldban az S osztly nem pldnyosthat a dinamikus trterleten:
struct S {
void *operator new(size_t) = delete;
void *operator new[](size_t) = delete;
};
int main() {
S *p = new S;
// hiba
S *q = new S[3]; // hiba
S s;
S t[7];
}
32
// 12
// 4.88059e-313
// C++98, C++11 OK
// C++11 OK
33
Osztlysablonok esetn egyarnt kszthetnk lnevet az eredeti sablonhoz, vagy annak tetszleges
specializcijhoz. Fggvnysablonok esetn azonban nem rnk clt ilyen egyszeren.
template <typename T1, typename T2>
double f(T1 a, T2 b) {
return double((a+b)/2.0);
template <typename T>
double fa(T x) {
return f<int, T>(100, x);
}
Egy ltalnosabb megoldshoz tovbbi sablonokkal kapcsolatos megoldsokkal is meg kell ismerkednnk:
template <typename... Args>
auto g(Args&&... args) -> decltype(f(forward<Args>(args)...)) {
return f(forward<Args>(args)...);
}
34
Az albbi varins Rekord osztlysablon tetszleges szm s tpus adat egyttest kpes kezelni, br
elgg krlmnyes mdon.
#include <string>
#include <iostream>
using namespace std;
// A sablon deklarcija
template<typename ... Tipusok>
class Rekord;
// A rekurzv feldolgozs vgt jelz, res paramterlistj sablon
template<>
class Rekord<> {};
// Legalbb egy paramtert tartalmaz specializlt sablonvltozat.
// Az N elem paramterlistt, egy elem plusz N-1 elem
// paramterlistaknt dolgozza fel, rekurzv mdon.
template<typename Elso, typename ... Maradek>
35
A varins fggvnysablonok tpusparamtereit az osztlyokhoz hasonl mdon hasznlhatjuk, azonban itt tetszleges szm fggvnyargumentumbl ll el a tpuslista. A feldolgozst rekurzv mdon
vgezzk, ahol a rekurzis lnc vgt egy egyparamteres, tlterhelt fggvnysablon biztostja.
#include <iostream>
using namespace std;
template <typename T>
void Kiiras(T t) {
cout << t;
}
template <typename Elso, typename... Argumentomok>
void Kiiras(Elso e, Argumentomok... argumentumok) {
cout << e << " ";
Kiiras(forward<Argumentomok>(argumentumok)...);
}
template <typename T>
T Osszeg(T t) {
return t ;
}
template <typename T, typename ...P>
T Osszeg(T t, P ...p) {
if (sizeof...(p))
t += Osszeg(p...);
return t;
}
int main() {
int a=12;
double b=12.23;
string c = "C++11";
Kiiras(a, b, c, '\n'); // 12 12.23 C++11
cout << Osszeg(12,23) << endl; // 35
}
36
// 6
// 6.75
37
38
A to_string() fggvnynek vltozatai gyors konverzis lehetsget biztostanak az egyszer C++ numerikus tpusok string tpus sztringg val talaktshoz. Szles sztringg (wstring) a to_wstring()
fggvnyekkel alakthatjuk a szmokat.
4.1.3 Unicode karakterek s sztringek talaktsa
A <cuchar> fejllomnyban deklarlt fggvnyek a 16- s 32-bites szles karakterek (c16, c32) valamint a nullavg sztringben trolt, tbbbjtos (mb) karakterek kztti konverzik elvgzsre szolglnak:
mbrtoc16(), c16rtomb(), mbrtoc32(), c32rtomb()
9 darab karakter
0x67
0x6b
0x3a
0xd11e
0x20
0x70
0x69
0x3a
0x3c0
39
Mindkt megoldsban elveszett a violin kulcs karaktere, hisz az talakts 16-bites UCS2 kdolsra
trtnt.
4.1.4 j matematikai fggvnyek
A C++11 kibvti a matematikai fggvnyek sort, s mindhrom vals tpushoz biztostja a megfelel
tlterhelt vltozatot <cmath>:
Fggvny
acosh(x)
asinh(x)
atanh(x)
cbrt(x)
copysign(x,y)
erf(x)
erfc(x)
exp2()
Lers
rkusz-koszinusz hiperbolikus fggvny.
rkusz-szinusz hiperbolikus fggvny.
rkusz-tangens hiperbolikus fggvny.
Kbgykfggvny.
A visszaadott rtk x abszolt rtke, eljele pedig megegyezik y eljelvel.
Hibafggvny.
Kiegszt hibafggvny.
2 hatvnya (y=2x)
40
x y?
x < y vagy x > y?
true rtkkel tr vissza, ha az argumentum nem szm (NaN).
true rtkkel tr vissza, ha az argumentum normalizlt.
Nem sszehasonlthat?
A gamma-fggvny abszolt rtknek termszetes alap logaritmusa.
Kerekts a legkzelebbi egszre (long long tpussal tr vissza).
Kerekts a nulla felli legkzelebbi egszre (long long tpussal tr vissza).
1+x termszetes alap logaritmusa.
Kettes alap logaritmus.
A kettes szmrendszerben brzolt lebegpontos szm kitevje valsknt.
Kerekts a legkzelebbi egszre (long tpussal tr vissza).
Kerekts a nulla felli legkzelebbi egszre (long tpussal tr vissza).
Az NAN (nem szm) rtkkel tr vissza.
Az NAN (nem szm) rtkkel tr vissza.
Az NAN (nem szm) rtkkel tr vissza.
Az argumentum kerektse egsz rtkre a belltott kerektsi md alapjn.
Megadja a kvetkez brzolhat rtket (y irnyban).
Mint a nextafter(), azonban y long double tpus
Kiszmolja az osztsi maradkot.
Mint a remainder(), azonban a hnyadost is visszaadja (p mutat).
int rtkre kerekt, azonban hibt hoz ltre, ha az eredmny klnbzik az argumentumtl.
Kerekts int tpus egszre.
scalbn(x,n)
x * FLT_RADIXn (n egsz)
true rtkkel tr vissza, ha az argumentum negatv.
Gamma-fggvny.
Kerekts a legkzelebbi egszre, nulla irnyban.
signbit(x)
tgamma(x)
trunc(x)
x * FLT_RADIXn (n egsz)
41
Definci
ratio<1,1000000000000000000000000>
ratio<1,1000000000000000000000>
ratio<1,1000000000000000000>
ratio<1,1000000000000000>
ratio<1,1000000000000>
ratio<1,1000000000>
ratio<1,1000000>
ratio<1,1000>
ratio<1,100>
ratio<1,10>
ratio<10,1>
ratio<100,1>
ratio<1000,1>
ratio<1000000,1>
ratio<1000000000,1>
ratio<1000000000000,1>
ratio<1000000000000000,1>
ratio<1000000000000000000,1>
ratio<1000000000000000000000,1>
Lers
-24
10 *
-21
10 *
-18
10
-15
10
-12
10
-9
10
-6
10
-3
10
-2
10
-1
10
+1
10
+2
10
+3
10
+6
10
+9
10
+12
10
+15
10
+18
10
+21
10 *
A csillaggal jelzett tpusok megvalstsa opcionlis, csak akkor lteznek, ha az <cstdint> intmax_t
tpusa lefedi a szmll s a nevez rtkeit.
#include <iostream>
#include <ratio>
using namespace std;
int main()
{
typedef ratio<3,7> tort1;
typedef ratio<6,21> tort2;
typedef ratio_add<tort1, tort2> tort3;
cout << tort3::num << '/' << tort3::den << endl;
if (ratio_less<tort1, tort2>::value)
cout << "3/7 < 6/21\n";
else
cout << "3/7 >= 6/21\n";
constexpr int kg=123;
constexpr int gramm = ratio_divide<ratio<kg,1>, milli>::num;
cout << "123 kg = " << gramm << " gramm" << endl;
}
A program futsnak eredmnye:
42
5/7
3/7 >= 6/21
123 kg = 123000 gramm
43
4097594794
3284206494
1585982901
2813963803
2881504895
3379910637
431323802
3496590794
661944248
2108095663
5
6
2
3
8
9
8
9
3
8
0.71713
3.34636
2.85585
0.601554
2.89266
1.56064
1.85685
3.89834
2.57102
3.01404
Mg egy fontos ok, ami miatt inkbb a <random> knyvtrat hasznljuk a hagyomnyos rand() fggvny helyett. Az j eszkzkkel a vletlen szmok generlsa szlbiztos: vagy minden szl sajt loklis
motort alkalmaz, vagy egy kzs motorobjektumot rnek el szinkronizlva.
4.3 Id- s dtumkezels
A C++11 j idmodellel segti a programok s a szlak idkezelsi feladatait. A modell alapelemei az
rk (clocks), amelyek meghatrozzk az idszmts kezdett (epoch, pl. 1970. janur 1.) valamint az
ratsek gyakorisgt (vagyis az ra pontossgt, pl. 1 ms). Az raosztlyokat a <chrono> fejllomny beptst kveten a chrono nvtrben rjk el:
chrono::system_clock
a rendszer ltal hasznlt vals idej ra (bellthat),
chrono::high_resolution_clock a rendszerben fellelhet legpontosabb ra (bellthat),
chrono::steady_clock
pontos idmrshez jl hasznlhat monoton ra, amely
nem llthat be.
A msik fontos eleme az idkezelsnek az idtartam (duration), amely adott idegysgek szmt
jelli. Az idtartamot a chrono::duration<> osztlysablon kpviseli, melyet a ratio<> sablonnal egytt
hasznlva sajt idtartamegysgeket is kszthetnk, az elre definiltakon (chrono::nanoseconds,
chrono::microseconds, chrono::milliseconds, chrono::seconds, chrono::minutes, chrono::hours) tlmenen. (A msodperc az alaprtelmezett idtartam egysg.)
#include <chrono>
#include <iostream>
using namespace std;
using namespace chrono;
int main() {
typedef duration<int, ratio<1,2>> felmasodperc; // flmsodperc
felmasodperc d1(10);
seconds d2 = duration_cast<seconds>(d1);
cout << "a megadott id: " << d2.count() << " mp" << endl; // 5 mp
}
A duration<> sablon els paramtere az ratemek szmt trol tpus, mg a msodik a msodpercekhez kpest definilja az idtartamegysget. Az idegysgek szmt az idtartam osztly count()
tagfggvnyvel krdezhetjk le, mg a klnbz idtartamok kztti tvltshoz a
duration_cast<>() fggvnysablont kell hasznlnunk.
Az idtartam osztly tovbbi statikus tagjaival lekrdezhetjk az idtartamhoz tartoz nulls, minimlis s maximlis rtket:
cout << seconds::zero().count()<< endl; // 0
cout << seconds::min().count() << endl; // -9223372036854775808
cout << seconds::max().count() << endl; // 9223372036854775807
44
m1(3), m2(6),
* m1 - m2 / 2
m3.count() <<
(m3 <= m1) <<
m3(-1);
+ m1 % 2;
endl; // 12
endl; // 0
45
Vgezetl nzznk egy egyszer futsidt mr programot, amelyben megmrjk, hogy mennyi id
szksges 10 milli elemet tartalmaz vektor rendezshez!
#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>
using namespace std;
using namespace chrono;
int main() {
const int meret = 10000000;
vector<int> v(meret);
srand(unsigned(time(nullptr)));
for_each (begin(v), end(v), [](int& e) { e = rand();});
random_shuffle(begin(v), end(v));
auto start = high_resolution_clock::now();
sort(begin(v), end(v));
auto stop = high_resolution_clock::now();
auto eltelt = duration_cast<milliseconds>(stop - start);
cout << "mrt id: " << eltelt.count() << " ms" << endl; // 748 ms
}
46
A regulris kifejezsek megadsnl hromfle szablygyjtemny kzl is vlaszthatunk. Az alaprtelmezett az ECMAScript (ECMA-262, JavaScript, Perl 5) szintaxis, azonban a msodik argumentumban a POSIX alap (basic) s bvtett (extended) nyelvtannak elkalmazst is krhetjk.
A kvetkez pldaprogram a megadott sztringrl megllaptja, hogy egsz szmot tartalmaz-e vagy
sem:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
string input;
regex egesz("(\\+|-)?[[:digit:]]+");
while (true) // A q billentylenyomsig inputot vr
{
cout<<"Krek egy egsz szmot!"<<endl;
cin>>input;
if ( input == "q" )
break;
if ( regex_match(input, egesz) )
cout << "egsz" << endl;
else
cout << "hibs input" << endl;
}
}
47
Ugyancsak itt tallunk egy sor tpuskszt s -talakt sablont: integral_constant<>, add_const<>,
result_of<> stb.
A futs kzbeni tpusazonostst segti a tpusokhoz rendezett indexsort rendel type_index osztly
(<typeindex>):
#include <iostream>
#include <typeinfo>
#include <typeindex>
#include <unordered_map>
#include <string>
using namespace std;
class A {
public:
virtual ~A() {}
};
48
A template< class R, class... Args > class function<R(Args...)>; deklarls funtion<> sablon egy ltalnos cl fggvnyburkol (function wrapper), amellyel norml fggvnyekre, tagfggvnyekre,
lambda fggvnyekre valamint funktorokra egyarnt hivatkozhatunk. (Funktor functor olyan osztly, amely definilja a fggvnyhvs opertort.)
#include <iostream>
#include <functional>
using namespace std;
int Kerekit(double x) {
return int(x+0.5);
}
class A {
public:
long Levag(double x) { return long(x);}
};
class Funktor {
public:
long operator()(double x) const {
return (long)x;
}
};
49
// 12
A mem_fn<> sablon szintn fggvnyburkol objektumot kszt, azonban egy megadott tagfggvny
mutat alapjn.
#include <iostream>
#include <functional>
using namespace std;
class A {
public:
long Levag(double x) { return long(x);}
};
int main() {
A a;
auto levagFv = mem_fn(&A::Levag);
cout << levagFv(a, 12.7) << endl;
}
// 12
A function objektum rendelkezik a bool tpusra konvertl opertorral, mely mvelet eredmnybl
megtudhatjuk, hogy a fggvnyburkol kapott-e rtket:
#include <iostream>
#include <functional>
using namespace std;
int main () {
function<void()> f;
cout << (bool) f << endl;
f = [](){};
cout << (bool) f << endl;
}
// 0
// res lambda fggvny!
// 1
50
A bind<> fggvnnyel egytt hasznljuk a ref<> s a cref<> sablonokat, amelyekkel a hvni kvnt
fggvnyhez referencia, illetve konstans referencia tpus argumentumokat kthetnk:
#include <functional>
#include <iostream>
using namespace std;
void Fv(int& a, int& b, const int& c) {
cout << "Fggvnyen bell: " << a << ' ' << b << ' ' << c << endl;
++a, ++b;
}
int main() {
int a = 1, b = 2, c = 3;
function<void()> fvHivas = bind(Fv, a, ref(b), cref(c));
a = 10, b = 20, c = 30;
cout << "Fv hvsa eltt: " << a << ' ' << b << ' ' << c << endl;
fvHivas();
cout << "Fv hvsa utn: " << a << ' ' << b << ' ' << c << endl;
}
A program futsnak eredmnye:
Fv hvsa eltt: 10 20 30
Fggvnyen bell: 1 20 30
Fv hvsa utn: 10 21 30
51
Az osztlyaikat egyszeren ellthatjuk inicializl listval. Mindssze egy olyan konstruktort kell ksztennk, amely egy initializer_list<> tpus paramterrel rendelkezik:
#include <iostream>
#include <initializer_list>
#include <memory>
using namespace std;
template<typename T>
class Vektor {
T* adatok;
int meret;
public:
Vektor(initializer_list<T> lista) {
meret = (int)lista.size();
adatok = new T[meret];
uninitialized_copy(begin(lista), end(lista), adatok);
}
~Vektor() { delete []adatok; }
void Kiir() {
for (int i=0; i<meret; i++)
cout << adatok[i] << " ";
cout << endl;
}
};
int main() {
Vektor<int> v {1,2,3,4,5};
v.Kiir();
}
52
C++11
C++98
Asszociatv trolk
set rendezett halmaz egyedi kulcsokkal,
map rendezett sztr egyedi kulcsokkal,
multiset rendezett halmaz,
multimap rendezett sztr.
// msols
// mret lekrdezse
// 1 2 3 0 0
Tbbdimenzis tmbk esetn szintn a C-stlus megoldshoz hasonl mdon jrhatunk el, pldul
2x3-as mtrix esetn:
array<array<int,3>, 2> m;
for (int i=0; i<m.size(); i++)
// sorok
for (int j=0; j<m[i].size(); j++) // oszlopok
m[i][j]=i+j;
0
1
1
2
2
3
53
int main() {
// A lista ltrehozsa s feltltse
forward_list<int> lista = { 1, 2, 3, 4 };
ListaKiir ("A kiindul lista:", lista);
// Elem beszrsa a lista elejre
lista.insert_after(lista.before_begin(), 10);
lista.push_front(11);
lista.insert_after(lista.before_begin(), {21,22,23,3,11,12} );
ListaKiir ("8 j elem az elejre:", lista);
// Az els kt elem trlse
lista.erase_after(lista.begin()); // 2. elem
lista.pop_front(); // 1. elem
ListaKiir ("Az els 2 elem trlve:", lista);
// A lista rendezse s az ismtld elemek trlse
lista.sort();
lista.unique();
ListaKiir ("Rendezett, kiegyelt:", lista);
}
A program futsnak eredmnye:
A kiindul lista:
8 j elem az elejre:
Az els 2 elem trlve:
Rendezett, kiegyelt:
1 2 3 4
21 22 23 3 11 12 11 10 1 2 3 4
23 3 11 12 11 10 1 2 3 4
1 2 3 4 10 11 12 23
A szabvnyos C++11 nyelv a korbbi asszociatv kontnerekhez elrhetv tette az elemeket rendezettsg nlkl trol prjukat: unordered_set<>, unordered_multiset<>, unordered_map<> s
unordered_multimap<>.
Mg a C++98 halmaz s sztr objektumai az elemeket binris rendezfban troljk, addig az j
megoldsok hast (hash) tblt alkalmaznak. A kt csoport osztlyainak programozi fellete majdnem teljes egszben megegyezik, mint ahogy az albbi pldban is lthat. Termszetesen az
unordered_xxx<> kontnerek nem rendelkeznek a rendezettsgre pl tagfggvnyekkel (rbegin(),
lower_bound(), value_comp() stb.).
#include <iostream>
#include <unordered_map>
#include <map>
#include <string>
using namespace std;
54
int main() {
unordered_map<string,int> win;
// Elemek bevitele
win["NT"] = 0;
win["XP"] = 1;
win["Vista"] = 6;
win["7"] = 9;
win["8"] = 12;
// A trolt vszmok mdostsa
for (auto p = win.begin(); p != win.end(); ++p)
p->second += 2000;
// Az "NT" tnevezse "2000"-re elemcservel
win["2000"] = win["NT"];
win.erase("NT");
// Az elemek rtk szerint rendezve a multimap-ben
multimap<int, string> winmm;
for (auto p = win.begin(); p != win.end(); ++p)
winmm.insert(pair<int, string>(p->second, p->first));
// Az elemek kirsa
for (auto p = winmm.begin(); p != winmm.end(); ++p)
cout << "Windows " << p->second << " " << p->first << endl;
}
A program futsnak eredmnye:
Windows
Windows
Windows
Windows
Windows
2000 2000
XP 2001
Vista 2006
7 2009
8 2012
55
// msol
// thelyez
A <utility> fejllomnyban definilt move fggvnysablon a balrtk hivatkozsokat jobbrtk hivatkozsokk alaktja, gy a msol konstruktor s a msolssal elvgzett rtkads helyett az thelyez
konstruktor s az thelyez rtkad opertor hvdik meg. A megolds clja a sok ideiglenes objektumpldny szmnak cskkentse, gy a programfuts hatkonysgnak nvelse. A move hvs
eredmnye valjban egy xvalue referencia, ami azt jelenti, hogy a fordt az thelyez tagfggvnyek (rvalue) hinyban a megfelel msol tagfggvnyeket (lvalue) hvja.
#include <vector>
#include <complex>
#include <iostream>
using namespace std;
typedef complex<double> komplex;
56
Az ideiglenes objektumok elkerlsnek msik mdja a kontner osztlyok bvtse az emplace() (az
insert() helyett) s az emplace_xxx() tagfggvnyekkel, amelyek helyben hozzk ltre a troland
objektumot.
#include <iostream>
#include <vector>
#include <complex>
using namespace std;
int main() {
vector<complex<double>> cv { {12,7} };
cv.push_back(complex<double>(12,23));
cv.emplace_back(7,29);
cv.insert(cv.begin(), complex<double> (10,2));
cv.emplace(cv.begin(), 11,30);
for (const auto& c : cv)
cout << c.real() << " + i" << c.imag() << endl;
}
A program futsnak eredmnye:
11 + i30
10 + i2
12 + i7
12 + i23
7 + i29
57
// msols
vector<string> v2gr(make_move_iterator(lsgr.begin()),
make_move_iterator(lsgr.end())); // thelyezs
cout << "lsqr tartalma: ";
for (const auto s : lsgr)
cout << "\"" << s << "\" "; cout << endl;
Kiir("v1gr tartalma: ", v1gr);
Kiir("v2gr tartalma: ", v2gr);
typedef vector<string>::iterator tmutato;
string s = accumulate(move_iterator<tmutato>(v1gr.begin()),
move_iterator<tmutato>(v1gr.end()), string());
cout << s << endl;
Kiir("v1gr tartalma: ", v1gr);
}
A program futsnak eredmnye:
lsqr tartalma:
v1gr tartalma:
v2gr tartalma:
C++JavaC#
v1gr tartalma:
58
vektor: 7 2 30 12 23 29 10 11
sszeg: 124
59
T min(initializer_list<T> t)
T min(initializer_list<T> t, Compare comp)
T max(initializer_list<T> t)
T max(initializer_list<T> t, Compare comp)
60
61
21 13 8 5 3 2 1
rendezett
Kevert: 13 5 2 3 1 21 8
min: 1 max: 21
tuple_size<>
Az osztlysablon constexpr size_t tpus value tagja megadja a rekord elemeinek szmt.
tuple_element<>
make_tuple()
forward_as_tupe()
tie()
tuple_cat()
get()
ignore
62
<<
<<
<<
<<
"elemek szma:
"1. elem: " <<
"2. elem: " <<
"3. elem: " <<
elemek szma: 3
1. elem: 2004
2. elem: 10.2
3. elem: Ivn
a: 2004
b: 10.2
s: Ivn
MXY238
1998, 14882, C++
2011, 14882, C++11
<cstddef>
<cstdint>, <cinttypes>
<limits>, <climits>, <cfloat>
<cstdlib>
<new>
<typeinfo>, <typeindex>, <type_traits>
<cstdarg>, <csetjmp>, <ctime>, <csignal>,
<cstdlib>,<cstdbool>, <cstdalign>, <initializer_list>
63
Hibakezelsi knyvtr
Kivtelkezels
Kivtelosztlyok
Assert makrk
Hibakdok
Rendszerhiba-tmogats
<exception>
<stdexcept>
<cassert>
<cerrno>
<system_error>
<utility>
<functional>
<memory>, <scoped_allocator>
<bitset>, <tuple>
<ctime>, <chrono>
Sztring knyvtr
Sztring osztlyok
Nullavg karakterlncok kezelst segt
fggvnyek
<string>
<cctype>, <cwctype>, <cstring>, <cwchar>, <cuchar>
<locale>
<clocale>
<codecvt>
Algoritmusok knyvtra
Adatsorkezels, rendezs, keress stb. (STL)
A C knyvtr algoritmusai
<algorithm>
<cstdlib>
Numerikus knyvtr
Komplex szmok
Szmtmbk
ltalnostott numerikus mveletek (STL)
A C knyvtr numerikus elemei
Fordtsidej racionlis aritmetika
Vletlen szm ellltsa
A lebegpontos krnyezet kezelse
<complex>
<valarray>
<numeric>
<cmath>, <cstdlib>
<ratio>
<random>
<cfenv>
Input/output knyvtr
Forward (elrevetett) deklarcik
Szabvnyos iostream objektumok
Az iostream osztlyok alaposztlya
Adatfolyam pufferek
Adatformzs s manipultorok
Sztring adatfolyamok
Fjl adatfolyamok
64
<iosfwd>
<iostream>
<ios>
<streambuf>
<istream>, <ostream>, <iomanip>
<sstream>
<fstream>, <cstdio>
<regex>
<atomic>
65