Notes
-
Upload
dimitris-arvanitis -
Category
Documents
-
view
23 -
download
0
Transcript of Notes
-
pi pi
pi C++
-
Copyright c 20042013 , [email protected]
pi LaTEX2.pi (c , -pi ).
pipi 9 2014. pipi http://www.materials.uoc.gr/el/undergrad/courses/ETY215
-
i
1 11.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 pi 52.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 pi . . . . . . . . . . . . . . . . . . . . . . . . 72.2.1 pi . . . . . . . . . . . . . . . . . . . . . . . 72.2.2 pi . . . . . . . . . . . . . . . . . . . . . 72.2.3 pi . . . . . . . . . . . . . . 92.2.4 pi . . . . . . . . . . . . . . . . . . . . . . 92.2.5 pi . . . . . . . . . . . . . . . . . . . . 112.2.6 void . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2.7 Enumeration . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 pi . . . . . . . . . . . . . . . . . . . . . . . . . 122.4 . . . . . . . . . . . . . . . . . 142.5 . . . . . . . . . . . . . . . . . . . . . . 16
2.5.1 typedef . . . . . . . . . . . . . . . . . . . . . . . . . . 162.5.2 pi . . . . . . . . . . . . . . . . . . . . 162.5.3 pi . . . . . . . . . . 172.5.4 . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6 pi . . . . . . . . . . . . . . . . . . . . . . . . . . 192.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 192.6.2 (struct) . . . . . . . . . . . . . . . . . . . . . . . 22
2.7 . . . . . . . . . . . . . . . . . . . . . . . 232.7.1 . . . . . . . . . . . . . . . . . . . . . . . 28
2.8 (namespace) . . . . . . . . . . . . . . . . . . 292.9 (streams) . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.9.1 . . . . . . . . . . . . . . . . . . . . . . . 312.9.2 Strings . . . . . . . . . . . . . . . . . . . . . . . . 32
i
-
ii
2.9.3 . . . . . . . . . . . . . . . . 332.9.4 . . . . . . . . . . . . . . . . . . . . . . . 35
2.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3 43
3.1 . . . . . . . . . . . . . . . . . . . . . . . . . 433.1.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.1.2 ?: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.1.3 switch . . . . . . . . . . . . . . . . . . . . . . . . . . . 453.1.4 goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.1.5 assert() . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.2.1 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.2.2 do while . . . . . . . . . . . . . . . . . . . . . . . . . . 483.2.3 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.2.4 continue . . . . . . . . . . . . . . . . . . . . . . . . . . 493.2.5 break . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3 . . . . . . . . . . . . . . . . . . . . . . 503.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4 57
4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594.4 . . . . . . . . . . . . . . . . . 63
4.4.1 . . . . . . . . . . . . . . . . . . . 634.4.2 pi . . . . . . . . . . . . . . . . . . . . . . . . . 654.4.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 654.4.4 . . . . . . . . . . . . . . . . . . . . . 694.4.5 . . . . . . . . . . . . . . . . . . . 72
4.5 main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744.6 overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754.7 template . . . . . . . . . . . . . . . . . . . . . . 76
4.7.1 . . . . . . . . . . . . . . . . . . . . . . . . 784.8 inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794.9 pi . . . . . . . . . . . . . . . . . . . . . . . . 794.10 C++ . . . . . . . . . . . . . . . 804.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.11.1 . . . . . . . . . . 824.11.2 . . . . . . . . . . . . . . . . . . . . . . . . . . 84
-
iii
5 Standard Library 955.1 . . . . . . . . . . . . . . . 96
5.1.1 (Pair) . . . . . . . . . . . . . . . . . . . . . . . 965.1.2 . . . . . . . . . . . . . . . . . . 975.1.3 , . . . . 98
5.2 (containers) . . . . . . . . . . . . . . . . . . . . . . 995.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . 995.2.2 Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . 1045.2.3 vector . . . . . . . . . . . . . . . . . . . . . . . . . . . 1075.2.4 deque . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135.2.5 list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1155.2.6 set multiset . . . . . . . . . . . . . . . . . . . . . . 1205.2.7 map multimap . . . . . . . . . . . . . . . . . . . . 124
5.3 (algorithms) . . . . . . . . . . . . . . . . . . . . . 1285.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6 1436.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
6.1.1 . . . . . . . . . . . . . . . . . 1436.1.2 (encapsulation) . . . . . . . . . . . . . . . 1456.1.3 . . . . . . . . . . . 147
6.2 . . . . . . . . . . . . . . . . . . . . . . . . . 1496.2.1 pi pi . . 1506.2.2 (ConstructorsCopy constru-
ctor) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1536.2.3 (Destructor) . . . . . . . . . . . . . . . . 1566.2.4 (assignment operator) . . . . . . . . 1566.2.5 pi . . . . . . . . . . . . . . . . . . . . . . 157
6.3 template . . . . . . . . . . . . . . . . . . . . . . . . . 1586.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
pi . . . pi! 161
Fortran C 165.1 C . . . . . . . . . . . . . . . . . . . . . . . . . . . 165.2 Fortran . . . . . . . . . . . . . . . . . . . . . . . 167
pi 171.1 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.2 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176.3 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
183
187
-
iv
188
-
pi pipi pi -pi pi ISO C++, , pi pi.
C++ , , pi - pi pi pi - pi , pi pi Fortran C. pi pi- pi (pi ) pi- C++ pi .
pi pi pipi-pi pi C++, pi Standard 1998, pi pi , pi pi, pi pi pi pi pi pi pi.
pi pi, pi- pi C++ C pi- - , STL pi ,.. pi pi pi pi C++ pi 1 pi- ( pi pi ).
1http://www.dmst.aueb.gr/dds/faq/academic.html#oo
v
-
vi
-
1
pi pi . pi pi, pi pi, pi pipi pi . , pi , pi pi pi pi pi pi pi -, , pi .
pi pi pi- (Fortran, C, C++) pi pi,, pi, pi pi- ( pi) pi. pipi pi pi pi pi. pi , pi pi pi , pi , pi pi . pi pi- pi pi . pi pi pi pi pi, , pi pi .
pi pi C++ pi- . pi C++ pi pi pipi.
1.1
pi pi pi - pi : pi pi . pi pi C++ pi pipi
1
-
2 1.
, :#include
/*main:
Takes no arguments.Prompts for a real number and prints its square.Returns 0.
*/intmain() {
double a; // Declare a real variable
// Print text on screenstd::cout > a; // Get value from keyboard
// Print text on screenstd::cout
-
1.1. 3
pipi pi pi C++. pi pi pi , , pi pi (return 0;) , - } (pi pi 0).1 pi 0 pi main() pi pi . pipi pi . pi pi , pi main(). pi main() pi pi pi .
double a; pi pi () 15 a (2.2.5). C++ pipi , pi pi compiler, pi pi.
std::cin std::cout pipi pi- , , standard input () standard output () . () pi std::cin ( ) pi pi pi pi . pi-pi pipi, pi , pi standard header (2.9). , pi pi, C++ format / -. pi pi pi pi pipi. , , pi- pi.. pi pi pi (2.9.4).
pi (") pi - , C-style string. pi pi- pi \n (pi ), pi pi . - pi () pi pi (pi pi , (\)) pi pi pi (character literal, 2.2.2).
(*) pi pipi pi pipi.
(;) pi (, , ). pi pipi( pi #) ;.
1 pipi main() -.
-
4 1.
C++ pi pi -, pi. pi pi C++ . ( pi pi ). pi, , - pi pi (+=, ==, > bcout
-
2
pi
2.1
2.1.1
C++ pi . pi compiler pi
// ,
pi /* */ pi pi - pi .
/* */ pi pi pipi pi tab, . pi pi pi -.
:
// This is a commentint j; // Here is a declaration/* Let us make
an ugly multi-linecomment.
*/
pi pi pi , , pi , pi pi.
pipi pi- . , pipi pi : compiler pi pi
5
-
6 2.
#if 0.....#endif
pi pipi pi, pi (pipi ). pi, # pipi pi pi pipi.
2.1.2
, , pi, pi. C++ pipi (az,AZ), (09), underscore(_). pi . pi pipi C++ , pipi pi . pi underscore (_) pi pi pi compiler pi pi pi pi. pi, pipi pi C++ (Keywords, 2.1) , -, pi pi pi pi, pi.
:
pi :ena lathos onoma, pali_latho$, 1234qwer, delete, .onoma+
pi :timi, value12, ena_onoma_me_poly_megalo_mikos, sqrt, Delete
C++ Keywordsand and_eq asm auto bitand bitorbool break case catch char classcompl const const_cast continue default deletedo double dynamic_cast else enum explicitexport extern false float for friendgoto if inline int long mutablenamespace new not not_eq operator oror_eq private protected public register reinterpret_castreturn short signed sizeof static static_caststruct switch template this throw truetry typedef typeid typename union unsignedusing virtual void volatile wchar_t whilexor xor_eq
2.1: C++.
-
2.2. 7
2.2 pi
C++ pi pi pi pi pi pi :
2.2.1 pi
pi (bool) pipi pi pi pi (pi.. /, /-,. . . ). , pi.. a, :bool a;
pi pi pi true false. pi - pi, a pi pi pipi , pi (4.4), ( 6) namespace (2.8), pi (global) false.
pi pi:bool a = true;
, ,bool a(true);
pi bool pi pi pi, pi- pi , pi, - . pi , true 1 false 0. -, pi true 0 false. pi, (4.3) pi pi true false.
2.2.2 pi
pi (char) pi.. c, :char c;
pi pi pi pi - pi pi, pi, ASCII.
char c = a;
, ,
-
8 2.
char c(a);
pi c , a. pi pi () (") pi C-style string1 pi pi pi pi char.
pi pi - pi. 2.2, pi pi ( ) -pipi . ..char newline(\n);char bell(\a);char alpha(\141); // alpha = a in ASCIIchar Alpha(\x61); // Alpha = a in ASCII
pi pi C-stylestring.
: std::cout
-
2.2. 9
\? \ pi\" \\ pi \a \b \f \n \r Carriage return\t tab\v tab
\xhhh pi hhh\ooo pi ooo\0
2.2: .
2.2.3 pi
C++ pi pi wchar_t pi pipi 256 . pi.. pi pi pi 256 pi pi.. ASCII.
2.2.4 pi
(pi.. pi int) :int i;
pipi pi , namespace, i pi 0, pi. (pi.. 10) int i = 10;
, , int i(10);
pi pi pi pi. pi int pi - 16 bits, pi pi pi h215,215
= [32768,32768) . -
pi pi pi pi -
-
10 2.
std::numeric_limits::min()
std::numeric_limits::max()
pi header :
#include #include
intmain() {std::cout
-
2.2. 11
pi U u pi unsigned int, pipi pi pi unsigned long int.
2.2.5 pi
C++ pi pi : pi (float), pi (double) (long double). float double -pi long double. pi float pi pi std::numeric_limits::digits10 pi std::numeric_limits::min()
std::numeric_limits::max()
pi header . pi. std::numeric_limits::min() pi pi pi .
pi pi , -pi pi pi double, pi-pi pi pi pi.
, pi pi ( pi) pi pi double. pi pi pi . e E, pi, pi 10 pi pipi pi e/E :
2.034, 0.23, .44, 23., 2e4 ( 0.0002), 2.3E2 ( 230.0) .
F f pi float L l pi long double.
2.2.6 void
pi void pi pi pi- pi pi. pi pi pi - , pi pi
-
12 2.
. pi void* (- void) pi. pi pi pi .
2.2.7 Enumeration
Enumeration () pi pipi pi pi pi. ..enum Color {RED, GREEN, BLUE};
pipi pi, pi Color, pi - pi pi pi pi: RED, GREEN, BLUE. pi :Color c(RED);
switch(3.1.3), compiler pi pi- pi. pi, pi pi (4.4).
pi : pi pi pi pi 0. pi RED 0, GREEN 1 BLUE 2. pi pi pi pipi, pi pi pi 1 pi pi :enum Color {RED, GREEN=5, BLUE};// RED = 0, GREEN = 5, BLUE = 6
pi . , pi enum . :Color d(2); // Error
2.3 pi
pi pi C++ pi template class (6.3), pi pi.
C++ pipi pi header #include
-
2.3. 13
pi pipi. (pi.. z) pi, pi -
pi double :std::complex z; // z = 0.0 + 0.0 i
, double pi pi pipi pi (int, float, long double,. . . ). , 0, pi pi - , pi pi pi pi pi STL.
pi pi pi pi :
std::complex z1(3.41); // or z1 = 3.41;// z1 = 3.41 + 0.0i
std::complex z2(3.0,2.0);// z2 = 3.0 + 2.0i
std::complex z3(z2); // or z3 = z2;// z3 = z2
std::complex z4(std::polar(2.0));// z4 = 2.0 exp(0.0i)
std::complex z5(std::polar(2.0,0.75));// z5 = 2.0 exp(0.75i)
std::polar() pi (magnitude) pi (phase angle) ( rad) .
+,-,*,/ +=,-=,*=,/= (2.7) , pi pi pi . pi, C++ (4.1) , pi pi. std::abs() pi . pipi, std::norm() pi- std::arg() z = + i
std::abs(z) =p2 + 2,
std::norm(z) = zz* 2 + 2,std::arg(z) = arctan(/).
, std::conj() pi - . pipi pi pipi pi , pi, pi pi pi .
-
14 2.
pi z pi , std::real(z) std::imag(z), std::complex, z.real() z.imag().
pi pi - pipi , pi compiler:std::complex z(3.0,1.0);// z = 3.0 + 1.0i
z = std::complex(z.real(), 3.7);// z = 3.0 + 3.7i
z = std::complex(2.3, std::imag(z));// z = 2.3 + 3.7i
z = 5.0; // or z = std::complex(5.0);// z = 5.0 + 0.0i
z = std::complex(-1.0, 2.0);// z = -1.0 + 2.0i
> pi pi :
(pi,)(pi)pi
pi, , - typedef (2.5.1).
2.4
C++ pi pi ( 2.3). pi pi-
== != > < >= 2.0 true
-
2.4. 15
2!=1+1 false. pi- pi . ,pi , (==, ) (!=, ). pi- pi , pi pi .
C++ pi !(NOT), && (AND), || (OR). , pi, not, and or .
&& || pi pi ! :
! pi :
! (4 > 3) false. ! (4 < 3) true.
pi && true pi true. pipi false:
(4 > 3) && (3.0 > 2.0) true (4 < 3) && (3.0 > 2.0) false
|| pi- true pi pi true, false:
(4 > 3) || (3.0 < 2.0) true (4 < 3) || (3.0 < 2.0) false
C++, pi - pi bool:
bool a(3==2);bool b = ( (i > 0) && (i < max) );
C++: pi- pi pi pi pi (short-circuitevaluation). ..
(i < 0) || (i > max)
i < 0 true pi , pi pi. ,
(i < 0) && (i > max)
-
16 2.
i >= 0 false pi i > max. - pi pipi pi pi pi .
2.5
2.5.1 typedef
pi , pi-. pi , pi , pi typedef. , pi pi.. std::complexpi pi pi complex pi :typedef std::complex complex;
pi pi :complex z;
typedef pi pi pi pi : - pi pi pi . pi double. pi - pi pi pi , pipi pi double pi float. -, pi pi real pi pi typedef double real;
pi pi float :typedef float real;
typedef pi C++ pi pi- template functions (4.7).
2.5.2 pi
pi pi, compiler pi pi pi , , pi pi pipi pi pi pi . pi pi pi const pi pi ( ) :
-
2.5. 17
double const pi(3.141592653589793);int const maximum(100);
pi pi const pi .
pi pi- . pi pi (pi.. pi pi, )pi - pipi pipi pi .
2.5.3 pi
pipi blo-ck pi block pipi pi pi. pi - pipi . pi pi ( pi) , pi , pi . pi , - pi pi pi , namespace ( global) , pi 0 (pi pi). pi , static (4.9), pipi pi compiler pi pi .
pi pi C++pi pi, pi - pi C:int a = 3;
pi 2.3, pi pi pi (pi C++) pi pi pi . C++ pi,std::complex z(1.0,2.0); // z = 1.0 + 2.0 i
pi pi - pi pi pi - :int b = 4;int b(4);
, pi pi (pi.. int) - pi (pi.. std::complex), pi - pi pi :
-
18 2.
int c = int(3); // c = 3
std::complex z = std::complex(3.0, 2.0);// z = 3.0 + 2.0i
int d = int();// d gets default integer value, 0.
std::complex y = std::complex();// y gets the default value specified// in complex class, 0.0 + 0.0i.
pi - pi pi pi pi pi templates (4.7,6.3).
pi pi . int a;int b;
pi int a,b;
pi pi pi pi pi pi . .. int * a,b;
(pi pi), a, -, b. pi pi pi pi .
2.5.4
, , , pi pi -pi pi 2 } block pi . pi pi .
(global) pi, pi pi (4.4), ( 6) namespace (2.8), pi ( pi #include). pi pi , pi. , pipi
2 , pi.
-
2.6. 19
pi, pipi pi pi. pi 3 pi .
pipi pi pi - pi block . ..#include
intmain(){ // begin block Adouble x(3.2);
{ // begin block Bint x(5);
std::cout
-
20 2.
pi pi , , , pi.
C++ pi :
pi [pi_];
pi_ pipi - pi, . pi pi pi containers STL, 5.
pi pi pi temperature 365 pi (pi int):double temperature[365];
int const N(155);int telephone[N];
telephone pi pi pi pipi .
pi, pi.. temperature, - pi 0 D1 piD . pi, , pi 0. ..temperature[0] = 14.0;temperature[1] = 14.5;temperature[2] = 15.5;temperature[3] = 13.0;temperature[4] = 15.0;//.........
int i(3);
std::cout
-
2.6. 21
int primes[5] = {1,2,3,5,7};
int digits[] = {0,1,2,3,4,5,6,7,8,9}; // size is 10
char alphabet[5] = {a, b, c, d, e, f}; // Error
int a[5] = {12, 5, 4}; // a == {12,5,4,0,0}
pi pi ( ) pi pi pi pi C Fortran pi pi. ( pi) pi C C++ pi pi ( pipi ) pi.
pi C++ :
pi [pi__1][pi__2];
pi . pi, - 6 8 pi int a[6][8];
pi.. (3,2) pi pipi a[3][2].pi , :
int b[2][3] = { {0, 1, 2}, {3, 4, 5} };
pi, , pi pipi pi. pi , , , pi - pi (row-major order). Fortran pi (column-major or-der). pi, pi pi C C++ pi pi Fortran.
, pi , pi -, pi column-major order :
pi [Aij] N1 N2, C++ pi N1 N2. Ai,j a[i+ N1*j].
pi [Aijk] N1N2N3, pi N1 N2 N3. Ai,j,k a[i + N1 * (j + N2 * k)].
pi .
-
22 2.
pi pi pi pi C - pi pi pi pi, pi Fortran , pi, - pi .
pi , C++ pi pipi - pi pi. pipi, StandardLibrary (STL) pi pi pi - . pi pi std::vector pi header : - pi v, 30 pi pi.. double std::vector v(30);
pi . pi- , pi pi pi ::
#include #include
int main() {int N;
std::cin >> N; // get dimensionstd::vector v(N);
// v[0], v[1], ..., v[N-1]}
pi, pi v - pi C++. pipi pi pi std::vector 5.
2.6.2 (struct)
pi pi- pi.. . pi , pi- pi , , , , pi. pi pi , pi. pi pi C++ std::string pi header . pi pi , pipi pipi , :
-
2.7. 23
struct ChemicalElement {double mass;int Z; // atomic numberstd::string name;std::string symbol;
};
(;) pi }. () pi C++ pi };.3
pi ChemicalElement pi- struct pi , , pi ( ) - pi. pi pi . pi ChemicalElement pi pipi pi pi:ChemicalElement oxygen;
pi pi pi pi pi- pi pi pi , pi , pi..ChemicalElement hydrogen = {1.008, 1, "Hydrogen", "H"};
(.) pi (.) :oxygen.name = "Oxygen";oxygen.mass = 15.99494;oxygen.Z = 8;oxygen.symbol = "O";
std::cout
-
24 2.
+,-: a .
+,-,*: a,b -, .
/ pi a,b: a/b. /,% pi pipi .
pi . -pi std::pow() pi pi header ( 4.1).
C++ pipi (=): pi a = a + b; a+=b;. (+=, -=, *=, /=, %=) =. pipi , pi pipi pi pi a pi pi pi pi.
C++ ++ -- () pi pi . pi, pi.. pi b = ++a + c; 1 a, pi a pi pi . , pi.. pi b = a++ + c; pipi 1 a pi. ( 1) --. b = --a + c;
a = a-1;b = a + c;
b = a-- + c;
b = a + c;a = a-1;
++ -- - pi pi pi pi , pi, pi, pi, pi .
2.4 pi pi pi -. pi, pi pi
-
2.7. 25
pi . pi . ( ) pi pi - pi pi compiler pi . .. a--b (a--)b ( ) pi a-(-b). pi pi pi- pi.
pi pi pi pi compiler pi ( , - ) pi . pi.. pi int double pi int double pi pi pi . pi pi - pi int (pi bool char) pi int pi pi, . - pi pi pi pipi pi: pi.. pi bool char;
pi pi pi , ( pi pi ) - pi. pi pi, pi.. pi . pipi pi pi pi . pipi, -pi pi pi pi pi ( pi) pi.5 int a = 3.14; // a is 3short int b = 12121212121.3; // b = ??
pi pipi pi pi - pi. pi , (/) - pi pi . pi pi pi (pi) pi - pi pi /. pi pi pi static_cast:int sum = 2 + 3 + 5;int N = 3;
// Wrong valuedouble mean1 = sum / N;
// Correct value
5 compiler pipi pipi.
-
26 2.
C++pi .pi -> () pi pi []/ ( ) ++, -- sizeof pi sizeof()/ (pi ) ++, --bitwise NOT & pi * NOT ! /pi +, -pipi * ( pi) /pipi % + -pi , >>, = == !=bitwise AND &bitwise XOR ^bitwise OR | AND && OR || 4 ?:pi =pipi *= /=pipi %= += -=pi =bitwise AND &=bitwise XOR ^=bitwise OR |= ,
2.4: pi ( ) pi . pi.4 pi (?:) (=) 3.1.2.
-
2.7. 27
double mean2 = static_cast(sum) / N;
static_cast :
static_cast(variable);
pi pi pi :
(newtype) variable.
pi . pipi pi pi
pi overloaded , pi pi . .. - , std::sqrt() pi pi float,double, long double int pi pi . pi 4.6, pi pi compiler C++ ,pi pipi pi pi :
#include
intmain() {int p = 8;
double riza = std::sqrt(p);// Error, ambiguous
double r = std::sqrt(static_cast(p));// Correct. Calls sqrt(double).
}
C++ pi pi pi pi pi , pi..
int a;int b;
b = a = 3;//First a = 3; then b = 3;
bool cond;
cond = b < 5;// First check b < 5; true. Then cond = true.
-
28 2.
2.7.1
sizeof
sizeof pi pi pi- bytes.6 pi pi pi sizeof:int a;
std::cout
-
2.8. (NAMESPACE) 29
bit . pi (short int, int, long int, bool, char) enum, signed unsigned. pi 2.5.
bitwise NOT expr pi expr1 >> expr2& bitwise AND expr1 & expr2^ bitwise XOR expr1 ^ expr2| bitwise OR expr1 | expr2
= expr2&= bitwise AND expr1&=expr2^= bitwise XOR expr1 ^= expr2|= bitwise OR expr1 |= expr2
2.5: bit C++.
, pi 0 1 .
pi bits . pipi bits . > unsigned.
&, ^, | pi bit pattern pi pipi AND, XOR, OR bit .
pi bit (true/false,on/o, . . . ) pi . C++ bitset std::vector bool pi pi pi, pi.
pi pi pi pi bool,pi pi pi , pi pi pi bit byte, (2.2.4).
2.8 (namespace)
pi pi - pi pi ( pi ) pi . .. pi - pi pi pi solve, pi -
-
30 2.
pi pi pi pi . C++ pi namespace ( ) pi . pi:
namespace onoma {......double a;......}
a ( pi , , -, pi. pi) namespace onoma. pi namespace pipi -pi pi : onoma::a. - namespace pi pi pi (a). pi pi pi . , pi namespace pi pi pi .
namespace C++(2.1.2).
pi pi pi pi Standard Library (STL) - namespace std. pi cin, cout,complex pi pi std::. pi , pi namespacepi.. std, pi using namespace std; block pi pi . pi block pi pipi std::. ..
#include #include
// "std::" needed heretypedef std::complex complex;
intmain() {using namespace std;
// "std::" not needed herecomplex a(2.0,3.0);complex b(1.0);
// In the following cout "std::" is not neededcout
-
2.9. (STREAMS) 31
return 0;}
( ), pi - pi pi namespace :
using std::cout;
pi : namespace {...}. pi pi pi pi - pi namespace. pi pi , pi, pi .
main() pipi namespace pi global.
2.9 (streams)
(streams) pi pi- pi (std::cin) (std::cout) pi-. pipi, pi streams, std::cerr std::clog, pi standard error pi. pi pi pi pi pi, pi pi.. pipipi . pi pi pi pi , pi pi.. pi pi pi , pi pi - pi , pi pi.. pi . pipi streams header.
2.9.1
pi streams pi streams - . header pi std::ifstream std::ofstream.
std::ifstream inpstr("filename");
stream , inpstr, pi "filename". , pipi pipi.,
std::ofstream outstr("filename");
-
32 2.
stream , outstr, pi - "filename". pi, .
std::ofstream outstr("filename", std::ios_base::app);
"filename" stream outstr .
pi: inpstr, outstr ( pi , , pi pi) pi std::cin std::cout pi . , double a(10.0);
outstr > c;
pi a pi outstr c pi inpstr.
pi pi . pi pipi pi stream str (pi.. ), pi : str.close();. stream str str.open("filename");.
2.9.2 Strings
(streams) -, . C++ strings, pi pipi.
pi header pi , pi- std::istringstream std::ostringstream. pi pi ostringstream C++ string pi pi. pi- string, . pi C++ string pi pi "filename_3.dat":#include
intmain() {
-
2.9. (STREAMS) 33
std::ostringstream os;
os j; // j = 6is >> k; // k = 7
char ch;is >> ch; // ch = a
}
2.9.3
pi pi, pi pipi STL, (stream) standard output, standarderror, string,
-
34 2.
std::cin >> a;std::cin >> b;
( ) . pi -
pi . pi.. std::cout
-
2.9. (STREAMS) 35
pipi , inp >> i pi inp. pi i , true while.
pi streams
get(), pi pi pi pi EOF (pi eof() true). pi is pi pi ( 3.2.1)while (is.get() != \n);
seekg()/seekp() ( / ), pi- . .. - is is.seekg(0);.
2.9.4
(manipulators) pi pi C++, boolalpha noboolalpha, pi pi pi- pi, pi bool. header pi- pi
(no)skipws: () .
(no)showpos: () pi pi + .
(no)showpoint: () pi 0 .
scientific: pi pi d.ddddddDdd
fixed: pi pi dddd.dd
left/right: pi / pi.
header pi pi
setprecision() pi ( pi ) pi pi pi- . pipi 6.
setw() pi pi -pi pi ( ) pi pi. pipi 0.
setfill() pi pi setw() pi pi -. pipi .
-
36 2.
manipulators namespace std.:
#include #include #include
intmain() {
double b = 3.25;
std::cout
-
2.10. 37
2. pi pi pi C++ ;
() const() johns() y+z12() 1stclass() xyz123() George() ThisIsALongOne() To_onoma_mou() two-way() proto
() _posotita
3. pi C++ pi pi stream
std::cin std::cout std::cerr std::clog
4. C++
// { ; #
5. pi ;int a = 2, b = 3, c = 4;double x = y = 5;bool equal = b = 3;int d = d;int e = "e";
6. compiler; pi;
7. pi pi pi compiler; ;
-
38 2.
#include #include
intmain() {
int a = std::numeric_limits::min() - 10;int b = std::numeric_limits::max() + 10;std::cout
-
2.10. 39
() m*=++n() m+=--n==m--
11. pi pi :
() (50 - 5 * 4) / 10 - 7() 12 + -5 * 2 + 6 / 3() 1 + 2 + 3 + 4 + 5 + 1 * 2 * 3 / 4 * 5() 3 > 7() (3 > 7) || (4 < 9)() 135 == 100 + 35() (true && false) || (true || false)() (3 > 7) || ((10 < 9) == (3 == 8))() false || !(3 > 7)() 3!=6
() 6 / 4 * 5 == 6 * 5 / 4
12. pi pi pi
() 7 / 2() 7.0f / 2() ((7 / 2) == (7.0 / 2))() ((6 * 3) / 80) / (36 - 7 * 5)
13. C++ pi 1 n.
14. pi a, b pi c pi a.
15.
() ++x+=+a++-+b++() ++x-=-a+b++() -x---a---b--
16. pi pi ; pi .
17. C++ pi pi pi :
() d.() pi r.
-
40 2.
() d h.() pi c
a,b pi.
18. pi pi pi :
() a==b||a==c&&c
-
2.10. 41
21. , pi -pi , , pi pipipi pi . pi: 200000, pipi - : 2 days, 7 hours, 33 min & 20 sec.
-
42 2.
-
3
3.1
3.1.1 if
if pi pi. () , pi pi. C++ :if (condition) {
... // block A} else {
... // block B}
(condition) pi pi , block pi pi pi {} (blockA). , block else (block B).
block pi pi pi , , pi. pipi pi pi pi pi ({}) pi pi. ..if (val > max)
max = val;else {
max = 1000.0;++i;
}
pipi pi else block pi pi -:if (condition) {
...}
43
-
44 3.
block pi pi pipi if. if (condition) {...} else {...} - . blockpi () . - pi pi .
pipi if, pi -pi else . else pi if block. pi, pi pi , pi :
if (i == 0)if (val > max)
max = val;else
max = 10;
pi, max = 10; i 0 (val > max) (i == 0). pipi pi pi pi pi-:
if (i == 0) {if (val > max)
max = val;}else
max = 10;
3.1.2 ?:
(?:) C++.
if (condition)val = value1;
elseval = value2;
val = (condition ? value1 : value2);
,
(condition ? : )
condition , .
-
3.1. 45
pi pi pi (?:) pi pi, - . pi - pi (=), pipi pi pi pi. ,pi : (?:) (=) pi, pi pi pi . pi, a = b ? c : d
a = (b ? c : d)
a ? b : c = d
a ? b : (c = d)
3.1.3 switch
switch pi pi pi-pi if. :switch (i) {
case value1:...case value2:.........case valueN:...default:...
}
i pipi pi (char, int, (short int,long int) signed unsigned pi ) enum. pi pi pi pi pi pi pi pi pi pi pi pi pi pi.
value1, value2,. . . ,valueN pipi pi enum ( pi).
, i pi value1, value2,. . . ,valueN. pi , - pi case.
-
46 3.
pi case / default pi, pi break ( pi.. goto, return,throw). break pi - switch. value1,value2,. . . ,valueN block default, pi., } switch.
case default pi pi-pi.
: pi pi-
pi pi pi . pi +, -, *, /. pipi pi pi pi pi pi pi. pi
#include intmain() {
double a, b, res;char c;
std::cin >> a >> b;std::cin >> c;
switch (c) {case +:
res = a + b;break;
case -:res = a - b;break;
case *:res = a * b;break;
case /:res = a / b;break;
default:std::cerr
-
3.1. 47
3.1.4 goto
pi pi (label). (pi.. labelname) pi .labelname : statement;
pi pi goto:goto labelname;
goto pipi pipi pi pi pi .
goto pipi pi. C++ pi pipi (3.2) goto pi-. pipi pi pi pi , pi pi pipi , . , goto pi pi pipi pi.
3.1.5 assert()
pi pi C++ pi header pi macro1 assert(). :assert(integer_number);
integer_number 0, pi pi, pipi NDEBUG pi pi- header. pi pi, pi pi assert() .
, assert() debugging, - pi pi pi 0 false (- , 2.2.1), pi pi -. pi.. pi assert(N
-
48 3.
3.2
3.2.1 while
while pi pi pi , pipi- . :while (condition) {
...}
while:
1. condition
, pi .
block {}.
2. block ( break, return, goto,throw, . . . ), pi 1 ( ). pi pi .
3.2.2 do while
do while pi while (3.2.1) pi . :do {
...} while (condition);
do while:
1. block {}.
2. pi ( break, return, goto, throw,. . . ), condition.
, pi .
pi 1 ( block).
3.2.3 for
pi pi for pi pi pi pi pi. C++ for pi pi . :
-
3.2. 49
for (initial_statement ; condition ; final_statement) {...
}
for :
1. initial_statement. pi- ( - (,), 2.7.1).
2. condition.
, pi for.
, block {}. pi block ( break, return,goto, throw,. . . ) final_statement.
3. block , pi 2( ). pi pi .
pi pi initial_statement, condition, final_statement pi- pi. pi (condition) for .
initial_statement pi , pi for, , , }.
: 10 pi pi a 0,10,20, . . .90pi :for (std::size_t i = 0; i < 10; ++i)
a[i] = i*10;
i pi pi . pi- , std::size_t i; pipi pi for:std::size_t i;for (i = 0; i < 10; ++i)
a[i] = i*10;
// here i is 10
3.2.4 continue
continue pi for,while, do while. pi , pi pi .
-
50 3.
3.2.5 break
break pi while,do while, for, switch. pi pi pi , pi pi .
3.3
block pi pi pi , , pi -. pipi pi pi pi pi- ({}) pi pi.
if while pi ( pi) -pi . pi .:
if (int j = 3) max = 10 + j;
j if. (3) true.
3.4
1. () for (;;) {...
}
() pi for pi while. pi do while;
2. pi pi:#include
intmain() {
int j = 3;
if (j = 4) {std::cout
-
3.4. 51
3. pi C++
() pi pi (n!) .() pi N pi Fibonacci2.
f (n + 2) = f (n + 1) + f (n), n 0, f (0) = 0, f (1) = 1 .() . -
pi 3.() pi La-
grange4: pi ( ) .pi: n, - a,b,c,d 0 a, b, c, d pn. pi pi pi n = a2+b2+c2+d2.
4. C++ pi pi
ex
ex =1Xn=0
xn
n!,
sin x
sin x =1Xk=0
(1)kx2k+1(2k + 1)! ,
cos x
cos x =1Xk=0
(1)kx2k(2k)! .
pi pipi pi pi pipi pi. pi pipi pi pi pi 1012.
5. pi pi 8 . std::rand() -pi pi 0 RAND_MAX. pi RAND_MAX compi-ler; std::srand().5
2http://oeis.org/A0000453http://en.wikipedia.org/wiki/Euclidean_algorithm4http://mathworld.wolfram.com/LagrangesFour-SquareTheorem.html5 UNIX man srand .
-
52 3.
6. () 1000 - [a, b] a = 20, b = 20. pi pi (pipi !)
int r = a + (b-a+1) * (std::rand()/(RAND_MAX+1.0));
pi: pi pi pi pi - r pi, pi 0 std::rand()RAND_MAX. RAND_MAX+1.0 RAND_MAX+1;
() pi C++ pi -pi pi , 0 pi.
7. Gauss, a
2a = n(n + 1) +m(m + 1) + k(k + 1)
pi n,m, k pi . pi pi pi a, pi n,m,k pi . pi pipi n,m,k pipi ( pi pi n m k). 16 ([0,1,5] [0,3,4] . . . ), 104([6,7,10] . . . ), 111 ([1,10,10] [0,9,11] . . . ).
8. pi C++ pi
() pi.() pi pi N .
( : pipi 2,3,5,. . . ).
() pi pi 6 ( p,p+6,p+12 pi -) pi .
9. pi pi pi-pi . , - pi . pi pi pi (pi) pi 2. - pipi pi pi pi. /pipi pi 1. - pi pi pi .
6http://oeis.org/A047948
-
3.4. 53
10. pi pi pi a, b, c pi 12 piax2 + bx + c. pi pi
x1,2 =b pb2 4ac
2a .
C++ std::sqrt() . . pi (pi a = 0 a =b = 0;). pi pipi pi pi( b2 < 4ac).
11. pi pi pi pi- 4 (, , ). Ferrari7.
12. piMN pi K 1 pipi 0. 1 pi pi.
() pi ( M = 20, N = 60, K = 400) pi , x o pipi.
() pi .ppbm ( M = N = 512, K = 150000):
pi : P1. : pi (. ).
1 0 pipi pi ( ).
pi pi plain pbm (por-table bitmap) pi pi pi pi-.
13. pi pi pipi pi- A (MN ) B (NP). M = 10, N = 20, P = 30 pi A, B matA.dat matB.dat. , pi pi . pi matC.dat C = A B.
7http://en.wikipedia.org/wiki/Quartic_function#Ferrari.27s_solution
-
54 3.
14. pi C++ pi pi Ax = B pi Gauss8. pi A B pi .
15. piC++ pi pi pi - pi A pi GaussJordan9.
16. () pi pi 30 pi f (x) = x(x2 + 5 sin(x)) [5 : 5]. C++ std::sin() .
() pi C++ pi pi pi-pi pi f (x) [5 : 5]
pi: x1, x2 Z x2x1
f (x)dx 12x (f1 + f2) .
Simpson: pi x1, x2, x3 Z x3
x1
f (x)dx 13x (f1 + 4f2 + f3) .
Boole: pi pi x1,x2, x3, x4, x5 Z x5
x1
f (x)dx 245x (7f1 + 32f2 + 12f3 + 32f4 + 7f5) .
Durand: n pi x1,x2, . . . , xn Z xnx1
f (x)dx x25 f1 +
1110 f2 + f3 + + fn2 +
1110 fn1 +
25 fn
.
pipi pi fi f (xi) x pi - . pi [10 sin(5) 50 cos(5)]. pi pi .
8http://mathworld.wolfram.com/GaussianElimination.html9http://mathworld.wolfram.com/Gauss-JordanElimination.html
-
3.4. 55
17. Spline Fit. n (xi , yi). pi- pi 2(n 1) . pipi, pi pi pi pi ( 2(n 2) ). pi pi pi 0 (2 ), pi , . pi pi (2 ). 4n 4 . pi pi pi pi pi pi pi .
() pi pi pi spline pi pi- pipi .
() pipi pi pi - .
() pipi pi pi pi pi pipi - .
18. pi C++ pi pi Game of Life10 Dr.J. Conway. pi - : pi M N , pi (- ). pi K. ( ):
() ().
() pi- (pi).
() pipi pi - pi pi (pi pipi !).
pi pi pi- . pi pi plain pbm ( - 12) pi 11.
10http://www.math.com/students/wonders/life/life.html11 UNIX, pi imagemagick, ani-
mate *.ppbm
-
56 3.
pi pi pi -, (, ).
19. 1 pi, 2 pi, 5 pi, 10 pi,20 pi, 50 pi, 100 pi (= 1) 200 pi (= 2). pi pi . pi 300 pi;pi : , pi 300 pi, 150 pi, 60 5 pipi. 300 pi.
20. f (x), , pi x pi f (x) (f (x =0)), Mller.
() pi x0, x1, x2 pi .
() pi
q =x2 x1x1 x0 ,
A = q (f (x2) f (x1)) q2 (f (x1) f (x0)) ,B = (q + 1) (f (x2) f (x1)) + A ,C = (q + 1)f (x2) .
() pi pi pi
x3 = x2 2C(x2 x1)D
,
pi D pi B +pB2 4AC, B pB2 4AC.
() pi pi pi 20.
() x0 x1, x1 x2, x2 x3. pi pi 20.
() .
pi pi - , pi pi xn, q, A, B, C, D .
pi Mller, f (x) = x3 x + 1.
-
4
4.1
pi pi pi pi - C++, pi pipi . , , -, main(), , , . pi pi pi pi, , . pi pi , pi, , - , pi pi pi main() , pi . pipi pi pipi, .
pi pi pipi pipi pi -, pi, pi pi. pi.., pi pi, pi , pi pipi , pi, pi pi pi pi. pi pi pi pi , pipi pi pi pipi pi- pi pi .
pi pi pi (structured) (procedural)pi pi pi pi pipi C++.
pi pi -, C++ pi - .
57
-
58 4.
4.2
(reference) pi. ,pi.., a
int a;
pi (pi.. r) a :
int & r = a;
r pi pipi pi a. pi pi pi , pi &. pi ( ) pi pi ( pi, , pipi pi pi). pipi, pi pi pi pi pi .
pi, pipi a - r :
int a;int & r = a;
a = 3; // r = 3r = 2; // a = 2
int b = a; // b = 2
int c = r--; // c = 2, a = 1
int d;int & r = d; // Error
const, pipi :
int const a = 5;
int & r1 = a; // Error
int const & r2 = a;// Correct. Value of a cannot change through r2.
r1 pi, pi a, pi const, r1.
, , pi, pi C++ pi - , , pi ,
-
4.3. 59
. , - pi std::numeric_limits::digits10. pi - pi pi pi-:#include #include
intmain() {
int const & digits = std::numeric_limits::digits10;
std::cout
-
60 4.
, *p pi pi a pi pi pi *p a. ..double r = 5.0;double * q = &r;
*q = 3.0; // r becomes 3.0
pi pi void1:int a = 4;int * p;p = &a;int * q = p;
int * q = p; q int p. , q p , , *q *p ( a).
pi piint a = 5;int * p = &a;void * t = p;
void pi p, int,, , a. (*) p pi a , (*) t pipi. , void pipi pi pi static_cast pi (pi pi pipi -) pi pi pi pi . pipi , int * v = static_cast(t);
*v = 4;
a 4. pi pi
pi . (*) pi. pi-pi pi pi pi pi . , pi ( ) .
1 void * pipi .
-
4.3. 61
pipi pi pi 0. 0 pi , pi, pi- . (nullpointer) (*) pipi (pi pi). - (pi.. ) 0 ( pi , 2.2.1) pipi pi pipi pipi pipi pi . pi : pi- , , pipi pi pi.
pi . pi ( pi pi ):int a;
int * p1 = &a;int const * p2 = &a;int * const p3 = &a;int const * const p4 = &a;
p1 . p2 . pi pi *p2.
p3 . pi pi *p3 pipipi pi pi pi .
p4 . pi pi .
pipi pi pi : pipi .
:
double x = 1.2;
double * const p = &x;
double y = 0.1;
-
62 4.
p = &y; // error
double const * q = &x;
*q -= 0.2; // error
int const a = 2;
int * r = &a; // error
p pi pi pi, pi pi pi pipi *p. , p pi - . pi ++,--( pi ) : pi T sizeof(T) pi . pi, pi pi- (pi.. p+2) pipi sizeof(T). -, pi , , pi ( !) pi pi .2 pi pi pi void pi, pi pi, ( void *).
pipi pi pi . , pi-pi pi pi pi pi:int a[10];
int * p = &a[3];
int * q = p + 2; // q == &a[5]
, int a[10];int * p = &a[0];
*(p+i) pi a[i] , , p+i == &a[i]. pi pi pipi- pi pi pi pi pi.
pi , pi . pi a[i] pi *(a+i). pi, pipi pi pi-
2 pi std::ptrdiff_t pi .
-
4.4. 63
pi pi pi .
: pi :double b[10];
double * p = b;
for (int i = 0; i < 10; ++i)*p++ = 1.0;
pipi double b[10];
for (double * p = b; p != b+10; ++p)*p = 1.0;
2.6.2 pipi , pi.. member, (struct) , pi, , pi.. a, :a.member
pipi pi , pa, pipi [ pi pi (*) (.), 2.4](*pa).member
pi pi C++ , pipi:pa->member
4.4
pi pi pi-pi pi pi pi . pi- pi pi pi-pi pi pi pi , , pi 4.7, pi pi pi. - pi pi pi pi pi pi. pi pipi pi pi pi - , pi pi .
4.4.1
:
-
64 4.
pi_pi(pi__ , pi__ ,. . . ){// }
pi pi pi void pi pi- . , pi pipi pi pi pi pi (pipi, , pi ). pi , -, pi void. , pi, pi pi (}) .
pi pi- pipi pi pi, pi -:
pi_ _pi [ ]
. pi, , pi pi. , int a[] int *a . pi pi pi pi, , pipi . containers STL pi 5 pi.
pipi pi , pi . compiler pipi , (pi ) pi pi . pi . pi pipi ( {}pi ) pi (;):
pi_pi(pi__ , pi__ ,. . . );
pipi pi pi . pi -
. pipi pipipi .
, pi pi pi (pi ), , pi pipi :
-
4.4. 65
int func(double a, double b = 5.0);
func() pi pi - (pi a) pi b pi pipi , 5.0. , pi pi pi pi pi pi , pi, compiler pi pipi .
4.4.2 pi
pi pi
return ;
pi pi pi -. pi main() pi return: pi-pi, return 0;.
pi pi ( pi void) pi- pi return; ( ). pi, - pi pi pi pivoid. return , pi, pivoidf(int a) {
...return;
}
voidg(int b) {
return f(b);}
pi return, pi pi .
pi pi . pi- pi pi pi- pi pipi pipi, pi pi pi , .
4.4.3
pi , - pi pi pi pi
-
66 4.
( pi pi ). pi pipi pi , pi pipi pi pi-pi pi pi , pi pi .
pi pi pi pi pi pi pi pi pi, pi.. , , pi pi. pi pi pi . pi pipi pi read pi pi-:
:
#include #include
doublefunc(double a, double b);// declaration. The definition is elsewhere.
intread(double & a, char const fname[]) { // definition
std::ifstream file(fname);file >> a;
return 0; // All ok}
voidprint(char c) { // definition
std::cout
-
4.4. 67
double r;read(r, "input.dat");// calls function and ignores returned value.
}
pi pi -pi pi ( ). pipi pi pi pi . . pipi pi pi pi . ..
#include
void add3(double x) { x+=3.0; }
intmain() {
double z(2.0);
add3(z); // z = ???
std::cout
-
68 4.
pipi , pi , - pi, pi , pipi . pi, pi pipi pi pi ( ). pi pipi pipi, pi pi const. , pi
voidprint(double const a[], std::size_t N) {
for (std::size_t i(0); i < N; ++i)std::cout
-
4.4. 69
pi pi pi , xp, pi *xp ( pi)void f(double * xp);// argument cannot change, *xp can change
pi pi pi , *xp ( pi )void f(double const * xp);// argument cannot change, *xp cannot change
pi pi pi , xp, pi *xp ( pi )void f(double * & xp);// argument can change, *xp can change
pi a pi , pi - void f(double a[]);// argument cannot change, a[i] can change
pi a pi , void f(double const a[]);// argument cannot change, a[i] cannot change
4.4.4
, pi - pi headers, .h,3 pi pi pipi - pi #include "name.h"
pi name.h header, pi (pi, pi pi path -). headers pi pi - pi ("). , headers pi pi pi ().
pi headers, compiler pi pi . ,
3 pi compiler.
-
70 4.
pi , pi pi , headers.
: min/max pi pi /
pi :
min: < pi -pi max: < pi -pi
pi uti-lities.h (pi.. pi double)// utilities.h
// declarationsdoubledmin(double a, double b);
doubledmax(double a, double b);
utilities.cc // utilities.cc#include "utilities.h" // Not necessary but good practice
// definitionsdoubledmin(double a, double b) { return ab ? a : b; }
pi :
pi utilities.h , pi..#include #include "utilities.h"
intmain() {
double a, b;std::cout > a >> b;std::cout
-
4.4. 71
compile utilities.cc pi pi main() compiler pi -pi
pi - pi , linking.
(recursive)
C++ pipi . , pipi pi pi , pipi .
: pi pi pi pi-
(recursive) pi: ,
n! =(1 2 (n 1) n = (n 1)! n , n > 0 ,1 , n = 0 .
pi, pi pi n pi pi pi ( n 1). pi pipi pi C++ std::size_tfactorial(std::size_t n) {
std::size_t result;
if (n > 0)result = n * factorial(n-1);
if (n == 0)result = 1;
return result;}
pi pipi ( n pi pi pi- pi pi). factorial() factorial(n)!factorial(n-1)!factorial(n-2)! . . . ( pi pi pi ) 0.
pipi pi pipi (?:), 3.1.2:
-
72 4.
std::size_tfactorial(std::size_t n) {
return (n > 0 ? n * factorial(n-1) : 1);}
4.4.5
pi, , .
pi pi - f (x) pi , pi (x, y). pipi #include
double f(double x);
intplot(double low, double high) {
double const step = (high - low) / 100;
for (double x = low; x < high; x+=step)std::cout
-
4.4. 73
pi pi pi :double f(double x); // declaration of f(x)
double (*fptr)(double x); // declaration of a pointer
fptr = f; // assignment
double x = 1.2;
double y = f(x);
double z = fptr(x); // or z = (*fptr)(x);
// y == z
pipi plot :intplot(double low, double high, double (*f)(double x)) {
double const step = (high - low) / 100;
for (double x = low; x < high; x+=step)std::cout
-
74 4.
typedef int (*ftype)(double x, double y); // type
ftype g = func; // declaration with assignment
4.5 main()
pi pi pi - pi, main():
int main() {.....}
pi pipi pi main() pi ( pi ) :
int main(int argc, char* argv[]) {........}
pi ( 4.4.3) :int main(int argc, char** argv) {........}
pi , argc, pi 1 pi pi pi main()( 0, pi pi ). -, pi char, argc+1 pi C-style string . argv[0] pi pi pi, argv[1], argv[2],. . . pi,,. . . , , argv[argc], 0. - UNIX ( pipi pi ) pi pi . , a.out
./a.out 12 input.dat output.dat 4.5
main(), , argc 5, argv :
argv[0] == "./a.out";argv[1] == "12";argv[2] == "input.dat";argv[3] == "output.dat";argv[4] == "4.5";argv[5] == 0;
1 4 pi . -pi main() pipi pi. pi pi pi C++ header :
-
4.6. OVERLOADING 75
int atoi(char const * p); // C-string to intlong atol(char const * p); // C-string to long intdouble atof(char const * p); // C-string to double
pi strtod(). pipi namespace std. pi #include #include
intmain(int argc, char *argv[]) {
int n = std::atoi(argv[1]);// n gets the value of the first argument
double x = std::atof(argv[4]);// x gets the value of the fourth argument
std::ifstream filein(argv[2]);// open input file. Name is given in argv[2].
std::ofstream fileout(argv[3]);// open output file. Name is given in argv[3].
// ..........}
4.6 overloading
pipi pi pi pipi pi (), pi, pipi pi. pi pipi . C++ (overloading) pi pi pi - , pi pi pi, , . pi pi pi. pi C++pi pi pi pi double, float long double.
pi , compilerpi (pi pi) pi pi-. pi, , pi pi . pi , pi pi pi (pi.. bool, char, short int int, float double,. . . ). pi ,
-
76 4.
int double, double long double, void*,pi. pi pipi pi , pi pi pi pi , .
(pi ) pi pi pi compiler pi pi pi pi pi pi.
4.7 template
C++ pi pi pi templates (pi). pi pipi pi pi . pi pi (swap). - pi ,4 (int,float,. . . ), pi pi pi pi (, 6). overloading pi pi- pi . pi pi :voidswap(int & a, int & b) {
int const temp = b;b = a;a = temp;
}
voidswap(float & a, float & b) {
float const temp = b;b = a;a = temp;
}
voidswap(double & a, double & b) {
double const temp = b;b = a;a = temp;
}
4 , std::swap() .
-
4.7. TEMPLATE 77
...
...
pi pi pi pi. C++ compiler , pi pi pi (template) pi . template pi pi:template void swap(T & a, T & b) {
T const temp = b;b = a;a = temp;
}
pi template (pipi ) T (pi pi pipi pi pi) pi. - pi pi , pi , pi pi . - pi pi pi pi (pi template):
template .5
template pipi pi template :double a = 2.0;double b = 3.0;
swap(a,b);
pipi pi pi template pi pi pi pi pi . pipi pi swap(a,b).
pi pi, pi template pi pi (int, char, bool,. . . ) , enum.6
5pi Standard 1998 C++ pipi pi-pi pi template , pi, pi.. template . pi - pipi pi pipi pi .
6 pi -.
-
78 4.
, pi.., pi pipi . pi pi ( ) :
bool mult(int a, int b) {return !(a%b);
}
, mult(a,b). , b , pi template:
templatebool mult(int a) {
return !(a%b);}
mult(a). pi pi
template.
pi pipi pi pi- template pi . pi pi- header template.
4.7.1
pipi pi pi pipi pi templa-te pi (pi.. pi ) pi pi, pi pi com-piler pipi pi pi pi pi. pi.. - swap() pi XOR swap pi pipi. pi pi pi swap() :
templatevoidswap(int & x, int & y) {
x^=y;y^=x;x^=y;
}
pipi, swap(a,b) (, , swap ) pi , pipi pi .
-
4.8. INLINE 79
4.8 inline
pi pi pi pi , pi . C++ compiler pi pi , , pi pi pi pi. pi pi - . compiler pi pi inline pi pipi. , pi pi :
inline intmax(int a, int b) {
return a > b ? a : b;}
, , inline main(). inline pipi pi
compiler pi pi, pi -pipi. pi, pipi pi headerpi .
4.9 pi
pi - . pi, pi - pi . pi pi pi (0 pi ) pi pi , pipi, pi . pi pi static:
voidfunc(double a) {
static int howmany = 0;// .....
++howmany;}
howmany pi pi - . func().
-
80 4.
pi pi : pi pi compiler static, pi pi pipi ( 0 pi ). pi pi , , , - (}), pi . pi pi pi, - , pi , pi pi pi pi ( pi ).
pi ( - ) pi7.
4.10 C++
pi C++ pi . pi header pi float, double, long double. - 4.1 pi double. , pi . C pi pi C++ pi. namespace std.
pi . pi pi compiler pi pi pi pi ., pipi pi pi pi pipi pi , .
pipi pi pipi pipi , pi errno pi pi EDOM. pi , errno ERANGE:#include #include #include #include
int main() {errno = 0; // clear error. No error code is 0.
std::sqrt(-1.0); // here errno becomes EDOM.
if (errno == EDOM)
7 pi pi std::abort().
-
4.10. C++ 81
pi
doubleabs(double)
pi
.
doubleceil(double)
pi
pi
.
doublefloor(double)
pi
pi
.
doublesqrt(double)
.
pipi
.doublepow(double
x,doublea)
,x
a.
pi
a>0x=0
a
x0x=0.
doublecos(double)
.
rad.
doublesin(double)
.
rad.
doubletan(double)
pi
.
rad.
doubleacos(double)
.
[1:1
],
pi
[0
:pi]
rad.
doubleasin(double)
.
[1:1
],
pi
[pi/2:pi
/2]
rad.
doubleatan(double)
pi
.
pi
[pi/2:pi
/2]
rad.
doubleatan2(doublex,
doubley)
pi
arctan
(x/y).
pi
.
pi
[pi
:pi]
rad.
doublecosh(double)
pi
.
doublesinh(double)
pi
.
doubletanh(double)
pi
pi
.
doubleexp(double)
.doublelog(double)
(ln
).pi
.
doublelog10(double)
(log).
pi
.
doublemodf(double
d,double*p)
d.
*p.
doublefrexp(doubled,
int*p)
x
[0.5,1
)
y
d=x2y.
pi
x.
y*p.
doublefmod(double
d,doublem)
pipi
pi
d/m.
pi
pi
d.
doubleldexp(doubled,
inti)
d2i.
intabs(int)
pi
.
overlo
aded
longint.
div_tdiv(intn,intd)
pi
pi
n/d.
pi
quot,rem
pi
pi
div_t.
ldiv_tdiv(longintn,
longintd)
pi
pi
n/d.
pi
quot,rem
pi
pi
ldiv_t.
4.1:
.
-
82 4.
std::cerr
-
4.11. 83
2. pi pi . , pi pi , .
3. pi pi pi .
, pi pi .
pi pi , - pipi pi pi !
Insertion sort
pi pi. O(n2) ( pipi ) O(n). :
1. pi , pi.
2. pi , ,. . . pi pi (pi -), pi pi.
Quicksort
, pi , pi pi . O(n2) ( pipi ) () O(n logn). pi pi -, pi pi :
Quicksort pi
1. , pi- ( ).
2. pi . .
3. pipi . - pi pi, . .
4. .
5. pi- pi pi- .
-
84 4.
Quicksort pi
1. , pi- ( ).
2. pi , pi pi.
3. pi pi pi pi pi pi. : pi pi-pi pi pi . pi pi pi pi.
4. pi pi , pi .
5. pi pi , pipipi pi ( ). pi pi .
6. pi- pi pi- ( ).
Mergesort
pi pi . O(n logn). mergesort:
1. 0 1 , . :
2. pipi .
3. () mer-gesort.
4. pi - pi .
4.11.2
1. pi
() pi pi .
-
4.11. 85
() () pi. pi pi pi pi;
() pi .() pi pi-
.() pi -
.()
pi .() pi [a, b] pi pi-
pi .() pi pi -
pi pi , Pi aibi .2. pi pi
() ex
ex =1Xn=0
xn
n!,
() sin x
sin x =1Xk=0
(1)kx2k+1(2k + 1)! ,
() cos x
cos x =1Xk=0
(1)kx2k(2k)! .
pi pipi pi pi pipi pi. pi pipi pi pi pi pi .
3. C++ pi pi piLegendre, P(x). P(x) x 2 [1,1], pi pi- pi . pi P0(x) = 1 P1(x) = x, pi pi :
P(x) = (2 1)xP1(x) ( 1)P2(x) .
-
86 4.
4. pi Cli Pickover8:
Xn+1 = j100(ln(Xn) (mod 1))j X0 = 0.1.
5. pi pi pi A N pi9
detA =NXi=1
(1)i+jaij deteAij , j, pi.. 1. A i j aij, eAij pi pi pipi pi A i j .
6. pi pi pi Cramer10.
7. pi ( )
nm(r, , ) = Rn(r)Ym(, ) .
,
Ym(, ) =
s2 + 14pi
( m)!( +m)!
Pm (cos )eim .
pi Legendre, Pm (x), pi
= m
Pm (x) = (1)m 1 3 5 (2m 1) (1 x2)m/2 ,
= m + 1Pm (x) = x(2m + 1)P
mm (x) ,
pipi pi
( m)Pm (x) = x(2 1)Pm1(x) (l +m 1)Pm2(x) .
[0, pi] [0,2pi) -.
8http://mathworld.wolfram.com/CliffRandomNumberGenerator.html9http://mathworld.wolfram.com/DeterminantExpansionbyMinors.html
10http://mathworld.wolfram.com/CramersRule.html
-
4.11. 87
pi pi pi .
pi pi pi Le-gendre, Pm (x).
pi pi , Ym(, ). pi 50 100 -pipi pi pi Ym(, ). pi ylm_data sin cos,sin sin, cos , Ym(, )Y m(, ) (, , x, y, z,
) , = 2, m = 0 (, pi d-).
8. pi pi pi Hermi-te, Hn(x) pi x. pi pi :
Hn(x) 2xHn1(x) + 2(n 1)Hn2(x) = 0 , n 2 , H0(x) = 1, H1(x) = 2x. pi - ( m V = kx2/2) ( )
n(y) =
s1
2nn!ppiHn(y)ey
2/2 , (4.1)
pi y = xqp
km/~. pi pi pi Hermite pi pi pi() (4.1). pi n, x. m = k = ~ = 1. pi harmonic.dat pi pi- n = 5 60 pi x [6 : 6], x ( pi , x ).
9. C++ pi ( pi) f (x) = 0 [xa , xb] pipi - f (x). pi :
() 11. - pi pi , pi pi pi pi .
11http://mathworld.wolfram.com/Bisection.html
-
88 4.
() 12. , pi pi pi , pi pi pi pi pi- pi f (x). pi pi .
() Brent13. , pi pi- pi pi pi , , . pi- pi .
10. pi C++ pi pi pi . pi, pi pi pi 3 3 , , N N , (pi.. x o) pi pi (, , N-) , , . pi-pi pi , pi pi. pi pi pipi pi. pi pipi pi pi pi pi. , pipi pi pi , , , , pi . pi pi pi pi
x|o|x---| |o---o|x|
, pipi, pi pi ( ) pi pi.
11. pi C++ pi pi four-in-a-row pi. pi, pi pi - pi M N ( 7 pi 6 ). pi pi pi. pi pi , . pi , pi.
12http://mathworld.wolfram.com/MethodofFalsePosition.html13http://mathworld.wolfram.com/BrentsMethod.html
-
4.11. 89
pi pi pi . pipi pi pi pipi . , pipi pi pi ( )., pi pi .
12. Sudoku. pi C++ pi sudoku. pi pi 99 , 33 pi 1 9, pi ( pi).
pi pi pi, pi- pi pi.
pi pi :
() pi pi pi 1.
() pi pi -. , 2, 3, pi. pi . -pi , pi .
() pi . pipi pi 1 9, pi- pi pi. , . pi- , pi pi , -, pi pi ...
pi
-
90 4.
5 3 76 1 9 5
9 8 68 6 34 8 3 17 2 6
6 2 84 1 9 5
8 7 9
13. pi N . N N pi N , . pi pi pi pi pi. pi . pi pi pi pi pi pi . :
pi N N . board. 0 pipipipi .
pi N pi..column. pi ( i column[i]).
pi , pi pi (, ,) board. , pi pipi ( 0) pipi ( 1). pi pi pi.
pi pi pi-. pi pi 1 pipi, pi pi. pi .
pi pi . pi , pi , pipi pi pi . pi pi pi- pi .
-
4.11. 91
pi , pi pi, pi pi- pi . pi .
pi , pi (N N , pi pi - 1 0.).
14. pi 5 5 pi pi . , pi ( pi, , ). pi pi pi.
pi pi pi pi. , , pi , pi pipi pi. pi pi pi pi pi ( pi pi pi) pi pi pi. pi, pi pi pi (pi pi pi) pi .
pi .
pi pi pipi pi . pi pi - pi . .
15. pi fractal : - pi pipi, (x = 0, y = 0), (x 0, y0) pi
x 0 = a x + b y + ey0 = c x + d y + f
a, b, c, d, e, f .
pi fractal (, x 0 ! x y0 ! y pi (x 0, y0)). pi pi pi. (x, y) pi pi, pi fractal.
pi pi :
-
92 4.
() pi "in.dat" 4 . pi 7 pi : 6 pi a, b, c, d, e, f pi p . . pi, P pi , 1.
() pi pi r [0,1). -. , 0 r < p1 pi, p1 r < p1 + p2 - pi.
() pi pi 1000 pi pipi "fractal.dat".
pi pi "in.dat"
0 0 0 0.16 0 0 0.010.85 0.04 0.04 0.85 0 1.6 0.850.2 0.26 0.23 0.22 0 1.6 0.07
0.15 0.28 0.26 0.24 0 0.44 0.07
0 0 0 0.25 0 0.4 0.020.95 0.005 0.005 0.93 0.002 0.5 0.840.035 0.2 0.16 0.04 0.09 0.02 0.07
0.04 0.2 0.16 0.04 0.083 0.12 0.07 , pi "fractal.dat" pi pipi.
16. C++ - pi .
17. C++ - pi pi . pi pi . pi, pi pi pi .
18. pi std::swap() std::min(), std::max() STL,5.1.3.
19. pipi pi- pi std::vector (pi ) , , pipi
-
4.11. 93
pi (
-
94 4.
-
5
Standard Library
C++ , pi pi pi - pipi, pi pi pi pipi . pi (- 6) pi (templates, 4.7, 6.3), pi Standard Library (STL).
STL :
containers, pi- , -. pi pi pi pi pi . - pi containers pi pi (pi.. set, map) - (pi.. vector, deque) pipi pi(pi.. map).
iterators, container. iterators containers pi- pi , pi .pi container pipi - pi pi pipi .
, pi pi pi pi pi - pi , pi container pipi pi. - iterators.
pipi, STL pi pi (adapters) (function objects), pi pi.
95
-
96 5. STANDARD LIBRARY
pi containers (container adapters) bitset, STL, pi.
pi STL pi pi pi headers (pi.. / -, , , pi, ..pi.) pi- . pi pi pi C, pi. pipi STL.
pi - , containers pi pi .
5.1
5.1.1 (Pair)
STL pi containers pi pi - pi pi pi. pi, header pi, , std::pair. class template pi piT1,T2 . first second. (pi.. T1 int T2 double) pi pi pi :std::pair p1; // p1 == (0, 0.0)std::pair p2(3, 2.0);
pi pair :std::pair p(3, 2.0);
std::cout
-
5.1. 97
, pi ., second pi pi pi .
5.1.2
pi containers , -, , pi pi pi , pi , pipi pi . (function object functor). pi pipi, pi . , pi - pi (()) pi 6.
pi header , C++ pi std pi pi . - templates pi pi pi pi pi -pi. 5.1 pi pi . pi pi pi.
pi negate() pi1plus() pi1 + pi2minus() pi1 pi2multiplies() pi1 pi2divides() pi1 / pi2modulus() pi1 % pi2equal_to() pi1 == pi2not_equal_to() pi1 != pi2less() pi1 < pi2greater() pi1 > pi2less_equal() pi1 = pi2logical_not() !pi1logical_and() pi1 && pi2logical_or() pi1 || pi2
5.1: .
pi pi pipi pi (adapters), 5.2. .. plus() pi . pi- pipi pi , pi..
-
98 5. STANDARD LIBRARY
pi bind1st(functor,value) functor(value,parameter)
bind2nd(functor,value) functor(parameter,value)
not1(functor) !functor(parameter)
not2(functor) !functor(parameter1, parameter2)
ptr_fun(function) function functor
5.2: .
constval pi pi std::bind1st() :std::bind1st(plus(), constval)
, pi pi ( pi) pi (!) pi . pi pi ptr_fun(), , pi pi pi , 5.3.
5.1.3 ,
header std::min(), std::max() std::swap() templates. :namespace std {// minimum of a, btemplate T const & min(T const & a, T const & b);
// maximum of a, btemplate T const & max(T const & a, T const & b);
// b atemplate void swap(T& a, T& b);
}
pi pipi min/max - (
-
5.2. (CONTAINERS) 99
min/max : pi pi ( pi ). min/max :namespace std {// minimum of a, b based on cmp(a,b) orderingtemplate T const & min(T const & a, T const & b, Compare cmp);
// maximum of a, b based on cmp(a,b) orderingtemplate T const & max(T const & a, T const & b, Compare cmp);
}
pipi, pi pi std::min, pi pi :template T const & min(T const & a, T const & b, Compare cmp) {
return cmp(a,b) ? a : b;}
pi cmp(a,b) pipi pi true false pi (, ) pi . pi pi cmp templatebool cmp(T const & a, T const & b);
, cmp pi pi (()), pi 6.
5.2 (containers)
5.2.1
containers pi pi - pi pi. container pi- , . container, , pi pi pi C ( C++), (array). - C++ pi pi pi( malloc, calloc, realloc, new). pi pi , pi containers.
containers :
-
100 5. STANDARD LIBRARY
sequence containers pi pi pipi. pi- pi . .. container pi , pi- container pi . STLpi pi sequence containers: vector,deque list. pipi, string pi pi- pi picontainers pi pipi pi.
associative containers pi pi pi pi . STL pi pi associative containers: set, multiset, map multimap.
pi pi - associative container containers . pi- sequence containers - .
containers pi class template (6.3). container pi pi pi pipi pi. pi map multimap pipi pi pi pi pi . associative containers pi pi pi . pi pi pi pi pi- (true/false) pi pi . pi pi std::less (5.1.2) pi (
-
5.2. (CONTAINERS) 101
container
containers -. c ( ) set v vector :
#include #include #include
std::set c;
std::vector v;// use c, v ........
> v >>.
pi pi pi , containers:
cntr pipi pi container (vector, list, map,. . . ). pi , pipi pi template container (pi , -, pi.).
cntr c1;
c1 cntr.
cntr c2;
// fill c2 ....
cntr c3(c2);
c2 cntr, ( pi pi) c3 c2, pi. c2, c3 pipi pi. pi pi pi template.
pi pi iterator. , pi.. beg, end iterators () container beg end, pi container ( pi pi), [beg,end):
-
102 5. STANDARD LIBRARY
cntr c4;// fill c4 ...// set beg, end on c4
cntr c5(beg,end);// creates c5 by copying the elements of c4// from beg to (one before) end.
pi T1, T2 pi pi pi pi T1 pi T2. pi.. T2double, pi T1int ( pi int double) T1std::complex.
pipi pi containerspi pi- iterators pi - . pi pi.. vector pi pi- pi :#include
double a[5] = {0.1, 0.2, 0.5, 0.3, 7.2};std::vector v(a, a+5);
(4.3) pi pi pi n n . , a a[0] a+5 (pi a[4]).
pipi pipi, pi pi - pi , container.
containers
containers pi . - pi pi 5.3. re-verse iterator rbegin() pi pi reverse iterator rend() container -.
container (.) container ( ). pi.., vector pi c,std::vector c;
, pipi pi , pi pi pi pi pi:std::cout
-
5.2. (CONTAINERS) 103
pi size() pi .empty() true/false container .
( size()==0 pi pi )max_size() pi
( pi pi).swap() container
container pi .clear() ( container ).erase() iterator pi
iterators pi .insert() .begin() iterator pi .end() iterator .rbegin() reverse iterator .rend() reverse iterator pi pi .
5.3: containers STL.
pi container ==, !=, , = . containers pi , . :
1. . pi containers.
2. , container -.
3. containers .
pipi container
pipi pipi container :
pi container, pi:c1 = c2;
c1 c2. c1 pi c2. pi pi .
-
104 5. STANDARD LIBRARY
container pi pi std::swap() :std::swap(c1,c2);
, , swap()c1.swap(c2);
- insert():c.insert(pos, elem);
elem pi ( sequence containers) pi ( associative containers)pi iterator pos. associative containers pi pi , pi, pi pi pi pi . pi iterator . insert() .
:
erase() pi pi :c.erase(pos);c.erase(beg,end);
pi iterator pos - iterators [beg,end)(pi, , - c). c sequence container pi iterator pi associative containers pi pi.
clear(). - container. pi pi (pi void):c.clear();
pi , container pi pi-pi .
5.2.2 Iterators
pi pi pipi, pi iterators pi pi pi containers.
-
5.2. (CONTAINERS) 105
pi iterator pi pi pi . iterator pi pi pi pi, pi (*) iterator pi pi pi . , pi *it pi , container, pi iterator it.
, iterator pi (&) . pi pi- STL containers. pi, pi.. it, pi iterator container (pi.. vector) :std::vector::iterator it;
pointers iterators pi. Iterator pi pi pi :std::vector::const_iterator it;
pipi , it pi pipi pi const pi ( ) .
pipi rbegin() rend() container. pi (reverse) iterator. pi (pi pi pi) pi pi con-tainer pi containers.pi pi pi iterator. , , iterator, pi.. vector, :std::vector v(10);
std::vector::reverse_iterator rit = v.rbegin();
pipi, pi pi const_reverse_iterator iterators pi pi pi -.
: pi container, pi.. std::vector
v, pi pi ( 5.3 begin(), end()):for (std::vector::const_iterator cit = v.begin();
cit != v.end();++cit)
std::cout
-
106 5. STANDARD LIBRARY
++crit)std::cout
-
5.2. (CONTAINERS) 107
it1, it2 iterators pi pi contai-ner. random pi it2-it1 bidirectional it1 it2 pi pi . , pipi pipi it1 it2.
pi pipi pi container container , , , pi template. pi.., pi templatevoidf(C & a) {std::vector v;C b;...}
f std::vector pi piT pi pi C (pi pi pi pi,pi.. std::list). iterators pi std::vector::iterator itv; // errorC::iterator itl; // error
pipi C::iterator std::vector::iterator pi pi. -pi iterators typename:typename std::vector::iterator itv; // correcttypename C::iterator itl; // correct
5.2.3 vector
pi vector pipi pipi - pi pi. pi sequence container, pi . vector - pi . , pipi , pipi pi , pi. :
pi vector pi pi container. , pi -. pi pipi vector pi - pi . pi pi pi pi
-
108 5. STANDARD LIBRARY
vector pi pipi, , pi, , -. pipi, , iterators pi pi .
pi pi pi - vector pi pi (array), (pi pi) , - , - / . pipi, , pipi pi pi pi. pi vector pi pi .
std::vector pipi pi header.
vector pi pi- pi . pi pi pi pi .
std::vector v;
vector.
std::vector v(N);
v vector N pi T. pi T(), pi pi T.2 T pi, pi 0 (2.2).
std::vector v(N, elem);
v vector N elem. pi, , elem pi T pi pi pi.
std::vector v1(v2);
v1 v2.2 pi constructor, 6.2.2.
-
5.2. (CONTAINERS) 109
std::vector v(beg,end);
v pi iterators beg end.
vector pi - pi pi vector pipi size(), empty() max_size() pi pi :
capacity() pi pi pi pi- pi pi vector ,, .
reserve() - . pi pi vector . vector. , pi, pi N pi T pi vector , pi std::vector v;v.reserve(N);
N push_back() (pi - pi), pi std::vector v(N);
v[0], v[1], . . . , v[N-1].
pi pi- pipi container . pi pi vector.
v1 = v2;
v2 v1 .
v.assign(N,elem);
-
110 5. STANDARD LIBRARY
v N elem -pi , , pi v.
v.assign(beg, end);
v con-tainer ( pi) iterators beg pi end. pi pipi beg end container, pi pi pi pi v beg end.
v1.swap(v2);
std::swap(v1,v2);
v1, v2.
v.insert(pos, elem);
pi pi pi iterator pos, elem pi iterator .
v.insert(pos, N, elem);
pi, pi pi iterator pos, N elem, pi pi. pi pi pi pipi pi.
pi pi pi insert() iterators:v.insert(pos, beg, end);
, pi pi iterator pos, vector v, iterators beg (pi), end ( pi).
v.push_back(elem);
-
5.2. (CONTAINERS) 111
pi pi pipi elem pi vector. pi .
resize() pi - . pi pi. v.resize(N);
pi v N pi pi . pipi pi pi pi . , v.resize(N,elem);
elem.
vector :
resize() pi pi pipi. clear(). erase(). pi container pi, pi - pi iteratorsc.erase(beg,end);
sequence containers, pi pi pi iterator, pos:v.erase(pos);
pipi pi iterator pi- .
push_back() - pop_back(), pi , :v.pop_back();
-, iterators pi pipi. pipi, pi vector , , i-terators.
-
112 5. STANDARD LIBRARY
pi
pi pi, - vector :
([]) pi pi :std::vector v(3);
v[0] = 1.0;v[1] = 3.0;v[2] = v[1] + 5.0;
at() . pi, , ,. . . vector v v.at[0], v.at[1],v.at[2],. . . . pi pi pi pipi- pi [0:v.size()-1]pi pi.3 pi pi pi pipi .
front() back(). pi - pi , , pi .
(*) iterator. pi const_iterator pi pi .
:, pipi vector pi
:#include #include #include
intmain() {
std::vector v(10);// v = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}
// assign valuesfor (std::size_t i = 0; i < v.size(); ++i)
v[i] = 4.0 * i*i;
3 pi pi at().
-
5.2. (CONTAINERS) 113
std::vector v2(v);// v2 is a copy of v
// append more values to v2std::size_t const size = v2.size();for (std::size_t i = size; i < 2*size; ++i)
v2.push_back(4.0*i*i);
// print v2std::cout
-
114 5. STANDARD LIBRARY
pi pi , iterator - pi , pi .
deque pipi pi vector. pi capacity() reserve() pi vector. pi pi ( pi) pipi pipi deque , iterators . pi ( iterators).
capacity() reserve(), pi vector pi pi deque. pipi, -pi pi push_front() ( - ) pop_front() ( pi ), pi push_back() pop_back().
: pi deque . -
. pi iterator .
#include #include
intmain() {
std::deque d; // d is empty
for (int i = 0; i != 10; ++i)d.push_front(i);
// d is : {9, 8, ..., 0}
int & r = d.front();std::cout
-
5.2. (CONTAINERS) 115
std::cout
-
116 5. STANDARD LIBRARY
std::list c(N);: N pi- T().
std::list c(N, elem);: pi N elem.
std::list c(beg,end);: pi [beg,end).
pi list pi pi- :
c1 = c2;: c2 c1 .
c.assign(N,elem);: c N - elem.
c.assign(beg,end);: c iterators [beg,end).
c1.swap(c2); std::swap(c1,c2);: c1, c2.
c.insert(pos,elem);: pi pi iteratorpos elem. pi iterator .
c.insert(pos,N,elem);: pi pi itera-tor pos N elem. pi pi.
c.insert(pos,beg,end);: pi pi ite-rator pos [beg,end). pi pi.
c.push_back(elem);: elem c.
c.push_front(elem);: elem c.
c.resize(N);: N pi c. , pi pi . pi pi.
c.resize(N,elem);: , pi pi-pi elem.
-
5.2. (CONTAINERS) 117
pi list c, :
c.pop_back();: .
c.pop_front();: pi .
c.erase(pos);: iterator pos pi iterator pi.
c.erase(beg,end);: [beg,end) pi iterator pi.
c.clear();: c.
pi resize().
pi
pi list :
front() back(). pi - pi , , pi.
(*) iterator. pi const_iterator pi pi .
pipi
list, pi containers, pi size(), empty() max_size() pi pi pi (5.2.1), pipi iterators, pi , -pi capacity() reserve().
list pi pipi pi sequence containers:
c.remove(val);
c val.
c.remove_if(func);
-
118 5. STANDARD LIBRARY
pi pi - pi , true false. remove_if() list pi func() true.
unique() pi pi pi.
unique(func) pi func() pi true.
c1.splice(pos, c2);
, pi iterator pos, c2, - pi c2. c1, c2 pipi list.
c1.splice(c1pos, c2, c2pos);
pi iterator c1pos c2 iteratorc2pos. c1, c2 pi .
c1.splice(c1pos, c2, c2beg, c2end);
pi iterator c1pos c2 [c2beg, c2end). c1, c2 pi .
sort() (
-
5.2. (CONTAINERS) 119
c1.merge(c2, op);
pi pi op().
reverse() list pi .
:
#include #include
inline boollessthan10(double a) {return a < 10.0;
}
int main() {std::list c; // creates empty list
for (int i = 0; i != 10; ++i)c.push_back(2.0 * i);
// c: {0.0, 2.0, 4.0, ..., 18.0}
c.remove(18.0);// any element with value equal to 18.0 is erased.
c.remove_if(lessthan10);// all elements with value less than 10 are erased.
std::cout
-
120 5. STANDARD LIBRARY
pi . , pi- , lessthan10(), pi .
5.2.6 set multiset
set multiset containers pi pi - , pi . pi -, pi pi , pi pi.
containers multiset pi pi- pi set pipi pi pi . , set . , pi set multiset.
pi containers, pi , sequence containers pi pi - . (binary search) pipi pi associative containers O(logn) pi pipi sequence containers O(n).
std::set std::multiset pipi pi- .
pi set pi T pi pi pi.4 5.2.1 pi pipi:
std::set c;
set.
std::set c1(c2);
set .
4 pi pi pi pi.
-
5.2. (CONTAINERS) 121
std::set c(beg,end);
set pi pi container, pi- pi, iterators pi [beg,end).
pipi pi -, std::less pi (
-
122 5. STANDARD LIBRARY
c.insert(pos,elem);: pi elem, - pi pi iterator pos, pi iterator pi .
c.insert(beg,end);: c - [beg,end). pi pi.
pi set c pi :
c.erase(elem);: elem pi- pi
c.erase(pos);: pos. pipi.
c.erase(beg,end);: iterators [beg,end). pi pi.
c.clear();: c.
pi
pi pi set pi pi - . pi pipi - ., pi pi pipi. iterator pi - pi .
pipi pi pipi pi pipi pi .
pipi
set multiset, pi containers, pi size(), empty() max_size() pi pi pi (5.2.1),pi pi pi iterators. pi- , pi pi pi pi pi pi pi . :
count(elem): pi pi elem.
find(elem): pi iterator elem, pi, end().
-
5.2. (CONTAINERS) 123
lower_bound(elem): pi pi pi pi elem.
upper_bound(elem): pi pi pi pi elem.
equal_range(elem): pi, , iterators pi pi- pi elem.
:
#include #include #include
intmain() {
typedef std::set Set;
// define empty set.Set c;
// insert values in random order.
c.insert(5);c.insert(12);c.insert(3);c.insert(6);c.insert(7);c.insert(1);c.insert(9);
// print setstd::cout
-
124 5. STANDARD LIBRARY
std::cout
-
5.2. (CONTAINERS) 125
std::map c;
map.
std::map c1(c2);
map , pi.
std::map c(beg,end);
map pi pi map, pi - pi, iterators pi [beg,end).
pipi pi, std::less pi (
-
126 5. STANDARD LIBRARY
pi map c pi :
c.erase(key);: key pi pi .
c.erase(pos);: pos. pipi.
c.erase(beg,end);: iterators [beg,end). pi pi.
c.clear();: c.
pi
pi pi map pi pi - . pi pipi - . , pi pipi pi.
pi iterator. it iterator map (*it).first (, , it->first) (*it).second (, , it->second) - pi.
pipi pi pipi pi - pipi pi .
map (, multimap) pi set pi pi pi ( []) pi pi. , pi, pi pi pi pi . :
c map pi pi key c[key] .
c map pi pi key c[key] = value;
c make_pair(key,value). , ,pi pipi , pi.. std::cout
-
5.2. (CONTAINERS) 127
: , pipi map -
.#include #include #include #include
intmain() {
typedef std::map Map;
Map birthyear; // Empty map.
// insert a few pairs.birthyear.insert(std::make_pair("John", 1940));birthyear.insert(std::make_pair("Paul", 1942));birthyear.insert(std::make_pair("George", 1943));
std::cout
-
128 5. STANDARD LIBRARY
upper_bound(key): pi pi - pi pi key.
equal_range(key): pi, , iterators pi pi- pi key.
5.3 (algorithms)
STL pi pi pi - pipi . pi , pi : pipi , - , , , pi.
pi containers. pi pi pi iterators , pi, , containers pi pi -pi . , pi: container , pi , pipi pi . pipi - containers pi: -pi , pi.. , pi random iterators(5.2.2). pi pi pi contai-ners. pipi pi pi pi .
pi pi header . pi pi pi pi. - std.
pi iterators pi - container pi . pipi pi iterator pi , pi, . pi pi pi iterator pi pi . pi pi - container. pipi pi iterator pi pipi container .pipi, pi pi pipi pi pi , ( pi pi UnaryFunctor) ( pi BinaryFunctor)6.
pi pi :
6 pi accumulate, count.
-
5.3. (ALGORITHMS) 129
accumulate()
Type accumulate(Iterator beg, Iterator end, Type value)
Type accumulate(Iterator beg, Iterator end, Type value,BinaryFunctor op)
pi pi [beg,end) value. {a1, a2, a3, . . . }pi value + a1 + a2 + a3 + ...
pipi pi pi.
pi .
: std::vector v pi
pi pi :double sum = 0.0;for (std::size_t i = 0; i < v.size(); ++i)
sum += v[i];
accumulate, pipi pipi double sum = std::accumulate(v.begin(), v.end(), 0.0);
pi pi v, pi- pi double prod = 1.0;for (std::size_t i = 0; i < v.size(); ++i)
prod *= v[i];
, pi pi ( pi pi ) double prod = std::accumulate(v.begin(), v.end(), 1.0,
std::multiplies());
pi accumulate - , 5.1.2.
partial_sum()
Iteratorpartial_sum(Iterator beg1, Iterator end1, Iterator beg2)
Iteratorpartial_sum(Iterator beg1, Iterator end1, Iterator beg2,
BinaryFunctor op)
-
130 5. STANDARD LIBRARY
pi ( pi) ( ). pi :
pi beg2 beg1
pi beg2+1 beg2 beg1+1
pi beg2+2 beg2+1 beg1+2, .
pi [beg1,end1). ,
pi op(), , beg2+i+1 op(*(beg2+i), *(beg1+i+1)).
beg2 pi container pi beg1,end1.
pi .
inner_product()
Typeinner_product(Iterator beg1, Iterator end1,
Iterator beg2, Type value)
Typeinner_product(Iterator beg1, Iterator end1,
Iterator beg2, Type value,BinaryFunctor op1, BinaryFunctor op2)
pi pi value [beg1,end1) beg2. {a1, a2, a3, . . . } {b1, b2, b3,. . . } pi value + a1 * b1 + a2 * b2 + a3 * b3 + ...
pi pipi , op1(), op2(). pi value op1 (a1 op2 b1) op1 (a2 op2 b2) op1 (a3 op2 b3) + ...
pi .
for_each()
UnaryFunctorfor_each(Iterator beg, Iterator end, Unaryfunctor op)
-
5.3. (ALGORITHMS) 131
op() - [beg,end). pi op().pi pi op(). pi pipi, .
count()
Difference_typecount(Iterator beg, Iterator end, Type const & value)
Difference_typecount_if(Iterator beg, Iterator end, UnaryFunctor op)
pi pi [beg,end) pi value. associative containers pi .
pi pi op() pi true.
pi Difference_type 1.
: pi pi a, std::vector
v pi , pi :
std::size_t cnt = 0;for (std::size_t i = 0; i < v.size(); ++i)
if (v[i] == a)++cnt;
( pi pi ) pi pi count