Notes

198
Τμημα Επιστημης και Τεχνολογιας Υλικων Πανεπιστημιο Κρητης Εισαγωγή στη γλώσσα προγραμματισμού C ++ Σημειώσεις ∆ιαλέξεων Σταματης Σταματιαδης

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