рд╣рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ "рд╕реА ++, рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЦреБрджрд╛рдИред" рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рднрд╛рд╖рд╛ рдХреА рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрдерд╛рд╕рдВрднрд╡ рдмрддрд╛рдирд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдХрд╛рдлреА рд╡рд┐рд╢реЗрд╖ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЕрддрд┐рднрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рджреВрд╕рд░рд╛ рд▓реЗрдЦ рд╣реИ, рдкрд╣рд▓рд╛ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ, рдпрд╣рд╛рдВ рд╣реИ ред рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред
рд╡рд┐рд╖рдп - рд╕реВрдЪреА
рд╡рд┐рд╖рдп - рд╕реВрдЪреА рдкрд░рд┐рдЪрдп
рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдХрд╛рдлреА рдкреБрд░рд╛рдирд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╣рд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рддреАрдХ +
:ред-
, рдЖрджрд┐ред рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдХрд╛рд░ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВ, рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВред рдпрд╣ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реА ++ рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЧрдВрднреАрд░ рд╕рдорд░реНрдерди рд╣реИ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
1. рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдореБрджреНрджреЗ
1.1ред рдУрд╡рд░рд▓реЛрдб рдСрдкрд░реЗрдЯрд░реНрд╕
C++17 : +
, -
, *
, /
, %
, ^
, &
, |
, ~
, !
, ,
, =
, <
, >
, <=
, >=
, ++
, тАУ-
, <<
, >>
, ==
, !=
, &&
, ||
, +=
, -=
, /=
, %=
, ^=
, &=
, |=
, *=
, <<=
, >>=
, []
, ()
, ->
, ->*
, new
, new[]
, delete
, delete[]
.
( , C++98.) , , , . , ()
, . +
, -
, *
, &
, ++
, тАУ-
( ) тАФ , , 6 .
1.2.
, . тАФ +
+=
std::basic_string<>
. std::filesystem::path
(C++17). /
/=
. , . .
, . тАФ <<
. , , , .
std::out<<c?x:y;
(std::out<<c)?x:y;
std::out<<(c?x:y);
.
std::out
void*
, - . -, , . +=
, , , , .
1.3. ,
: ,
(), &&
, ||
. , ( ), (short-circuit evaluation), , . ( , , , &&
, false
, ||
, true
.)
&
( ). &
, . ++11 ( ) std::addressof()
, &
.
1.4.
. , . , , . , , , . , , . a=b=c
. bool
. +
, -
, ~
. , . , , ( . [Sutter1]). , , . .
1.5.
1.5.1.
: - (-) . - тАФ =
, ->
, []
, ()
. .
, - - operator@
, @
() . , . ()
.
, (-) , operator@
, @
() . , , . тАФ , ( ), , . , , . :
namespace N
{
class X
{
X operator+() const;
X operator+(const X& x) const;
void operator()(int x, int y);
char operator[](int i);
};
X operator-(const X& x);
X operator-(const X& x, const X& y);
}
, , -, .
1.5.2.
(): . .
( , N
):
N::X x, y;
N::X z = x + y;
N::X v = x тАУ y;
N::X w = +x;
N::X u = -x;
x(1,2);
char p = x[4];
N::X z = x.operator+(y);
N::X v = operator-(x, y);
N::X w = x.operator+();
N::X u = operator-(x);
x.operator()(1,2);
char p = x.operator[](4);
, , , . , , . ( ) , . ( тАФ .) ->
, , .
, , (argument depended lookup, ADL), , , , , , . , ADL .
1.5.3.
, , - . . , , . . , . , .
2.
2.1.
. тАФ const ( -), ( ). ()
.
std::string
+
: const std::string&
, const char*
.
3.4.2 ()
.
()
, .
2.2.
, , , .
2.2.1.
тАФ . , x@y
, y@x
. , - . +
std::string
, const char*
.
2.2.2.
-. (, -, .) . -, , , -, . . 3.8.
2.2.3.
тАФ . X
, , X
. , . , -, . .
int i = 42;
std::reference_wrapper<int> rwi(i);
std::cout << rwi << '\n';
std::reference_wrapper<int>
, int&
, . , , . , 2.3.
2.2.4.
, -, . 2.6.
2.3.
, , . , .
class X
{
friend X operator+(const X& x, const X& y)
{
}
};
. , , , . , . , [Meyers1]. +
friend
, -
.
template<typename T>
class Rational
{
T num;
T den;
public:
Rational(T n = 0, T d = 1) : num(n), den(d) {}
T Num() const { return num; }
T Den() const { return den; }
friend const Rational operator+(
const Rational& x, const Rational& y)
{
return Rational(
x.num * y.den + y.num * x.den,
x.den * y.den);
}
};
template<typename T>
const Rational<T>operator-(
const Rational<T>& x, const Rational<T>& y)
{
return Rational<T>(
x.Num() * y.Den() - y.Num() * x.Den(),
x.Den() * y.Den());
}
+
. , T
Rational
, . :
Rational<int> r1(1, 2), r2(31, 64);
Rational<int> r3 = r1 + r2;
Rational<int> r4 = r1 + 3;
Rational<int> r5 = 4 + r2;
Rational
int
. int
int
Rational
, .
-
.
Rational<int> r6 = r1 - 3;
Rational<int> r7 = 4 - r2;
, int
Rational
. , , -
:
template<typename T>
const Rational<T> operator-(const Rational<T>& x, T y)
{
return operator-(x, Rational<T>(y));
}
template<typename T>
const Rational<T> operator-(T x, const Rational<T>& y)
{
return operator-(Rational<T>(x), y);
}
. [Meyers1].
2.4.
, , (computational constructor). (return value optimization, RVO). . [Dewhurst].
2.5.
-, . , , ( NVI тАУ non virtual interface). ┬л┬╗ . . , , *a+*b
. , ( +
), , ( Visitor). , , . [Dewhurst]. . , , тАФ .
2.6.
, , . :
enum class Color { Begin, Red = Begin, Green, Blue, End};
Color& operator++(Color& col) { return (Color&)(++(int&)col); }
:
void Foo(Color col);
for (Color col = Color::Begin; col < Color::End; ++col)
{
Foo(col);
}
Color operator*(Color col) { return col; }
:
std::for_each(Color::Begin, Color::End, Foo);
. :
struct Colors
{
Color begin() const { return Color::Begin; }
Color end() const { return Color::End; }
};
for
:
for (auto col : Colors())
{
Foo(col);
}
3.
, .
3.1. ->
- ( ). (, ), , ->
. ┬л┬╗ тАФ . :
class X
{
void Foo();
};
class XPtr
{
X* operator->() const;
};
X x;
x->Foo();
x.operator->()->Foo();
->
.
3.2. *
->
. , , ->
. -.
*
.
3.3. []
, , , -, . , , , . ┬л┬╗ , , . . , , , , &[i]
, . , , .
тАФ .
T& operator[](int ind);
const T& operator[](int ind) const;
, -.
std::vector<>
, std::array<>
, std::basic_string<>
, std::deque<>
std::map<>
, std::unordered_map<>
. std::unique_ptr<>
.
3.3.1.
C++ , a[i,j]
, ┬л ┬╗, a[i][j]
. -. .
template<typename T>
class Matrix
{
public:
Matrix(int rowCount, int colCount);
class RowProxy;
RowProxy operator[](int i) const;
class RowProxy
{
public:
T& operator[](int j);
const T& operator[](int j) const;
};
};
Matrix<double> mtx(5, 6);
double s = mtx[1][2];
mtx[2][3] = 3.14;
3.4. ()
-. , . , ()
, , . C++ . C++ . , , : , , -, , . , . , , ( ), ()
-. тАФ std::for_each()
, .
3.4.1. -
C++ ( ). . - ┬л ┬╗.
3.4.2.
()
, . . .
3.4.3. -
( std::unordered_set<>
, std::unordered_multiset<>
, std::unordered_map<>
, std::unordered_multimap<>
) , - . -. ()
- std::size_t
. , . std::hash<>
, . , . , , -. .
- .
- .
C- .
3.4.4.
, . . ()
, , bool
. , . std::less<>
std::equal_to<>
, . <
, ==
.
std::less<>
std::set<>
, std::multiset<>
, std::map<>
, std::multimap<>
, std::priority_queue<>
.
std::equal_to<>
std::unordered_set<>
, std::unordered_multiset<>
, std::unordered_map<>
, std::unordered_multimap<>
.
, .
- , . , , , , ( ).
- , .
- .
C- .
3.4.5.
, . , (deleter). ()
. std::unique_ptr<>
std::default_delete<>
, delete
( delete[]
). std::shared_ptr<>
delete
. , . .
std::unique_ptr<>
-.- .
- std::shared_ptr<>
, std::shared_ptr<>
.
3.4.6.
, , . , ( ), .
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ <
рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ std::lexicographical_compare()
, рдЬреЛ рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рджрдо ( min_element()
, рдЖрджрд┐) рдореЗрдВ, std::sort()
рдкрд┐рд░рд╛рдорд┐рдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдФрд░ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ, рдкрд░реНрд╡рддрдорд╛рд▓рд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред ( std::make_heap()
рдЖрджрд┐)редрдСрдкрд░реЗрдЯрд░ рдХрд╛ ==
рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ std::equal()
рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо std::count()
рдореЗрдВ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рджрдо ( std::find()
, рдЖрджрд┐) рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ , std::replace()
рдФрд░ std::remove()
рдЬреЛ рдПрдХ рд╕реАрдорд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
+
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ accumulate()
ред (рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдП рджреЗрдЦреЗрдВ)
, .
- , . , .
- , . ( -.)
C- .
3.4.7.
C++11 . ()
. , - . .
#include <functional>
int Foo(const char* s) { return *s; }
struct X
{
int operator() const (const char* s) { return *s; }
};
std::function<int(const char*)>
f1 = Foo,
f2 = X(),
f3 = [](const char* s) { return *s; };
int r1 = f1("1"),
r2 = f2("2"),
r3 = f3("3");
3.5.
. bool
.
<
==
, . . (. [Josuttis]). <
: ( x<y
true
, y<x
false
), ( x<y
y<z
, x<z
), (x<x
false
), ( !(x<y) && !(y<x)
!(y<z) && !(z<y)
, !(x<z) && !(z<x)
). ==
: ( x==y
, y==x
), ( x==y
y==z
, x==z
), (x==x
true
). , . , .
. . <
==
, !
. , . std::rel_ops
<=
, >
, >=
, !=
. ( <utility>
.) .
#include <utility>
class X { };
bool operator==(const X& lh, const X& rh);
bool operator<(const X& lh, const X& rh);
bool operator<=(const X& lh, const X& rh)
{
return std::rel_ops::operator<=(lh, rh);
}
, std::rel_ops
, using
-:
using namespace std::rel_ops;
тАФ <
, <=
, >
, >=
, ==
, !=
, , : std::thread::id
, std::type_index
, std::monostate
. , , . .
==
!=
std::error_code
, std::bitset
. , <
.
3.6.
, +
+=
. , тАФ -. , +
, -
, -. .
class X
{
const X operator-() const;
X& operator+=(const X& x);
};
const X operator+(const X& x, const X& y);
+
, -
( ) . . , , . -, *this
. +
+=
, 1.4.1, , X
, const
.
. C-, . (. 2.2).
std::complex<>
. +
, +=
, -
, -=
. std::basic_string<>
+
+=
. std::filesystem::path
(C++17). /
/=
. , . .
3.7. ,
. , . - . .
class Iter
{
public:
Iter& operator++()
{
return *this;
}
const Iter operator++(int)
{
Iter it(*this);
++*this;
return it;
}
};
, , , . 1.4.
, .
3.8. << >>
( ). , : , , . .
#include <iostream>
struct Point
{
int X;
int Y;
};
std::ostream& operator<<(std::ostream& strm, const Point& p)
{
strm << '[' << p.X << ',' << p.Y << ']';
return strm;
}
тАФ , , . void*
, - . . 1.2.
3.9.
, -, . , , , . / . , . тАФ . ┬л ┬╗, , ( ), , .
тАФ , .
class X
{
public:
X(const X& src);
X(X&& src) noexcept;
X& operator=X(const X& src);
X& operator=X(X&& src) noexcept;
};
, , . - noexcept
.
. "=default"
.
class X
{
public:
X& operator=X(const X& src) = default;
X& operator=X(X&& src) = default;
};
. , , .
class X
{
public:
X& operator=X(const X& src) = delete;
X& operator=X(X&& src) = delete;
};
. , *this
. , a=b=c
. тАФ ┬л ┬╗. - , .
class X
{
public:
void Swap(X& src) noexcept;
X(const X& src);
X(X&& src) noexcept;
X& operator=X(const X& src);
X& operator=X(X&& src) noexcept;
};
:
X& X::operator=X(const X& src)
{
X tmp(src);
Swap(tmp);
return *this;
}
X& X::operator=X(X&& src) noexcept
{
X tmp(std::move(src));
Swap(tmp);
return *this;
}
, .
: , , ( ).
┬л ┬╗ , .
X& X::operator=X(const X& src)
{
if (this != std::addressof(src))
{
}
return *this;
}
, , . ┬л ┬╗ , , , , .
, , .
X& X::operator=X(const X& src)
{
if (this != std::addressof(src))
{
this->~X();
new (this)(src);
}
return *this;
}
this
, new
, this
, . , , , . , , this
, , . . , X
- X
. this->~X()
, . .
( ) , /. ( .) , . .
3.10. !
, . true
, (┬л┬╗, ┬л┬╗). . explicit
bool
, , true
, .
explicit operator bool() const noexcept;
4.
. , .
.
.
std::variant<>
(C++17). std::visit()
, ()
std::variant<>
, . std::visit()
()
, std::variant<>
. .
using IntStr = std::variant<int, std::string>;
struct Visitor
{
void operator()(int x) const
{
std::cout << "int, val=" << x << '\n';
}
void operator()(const std::string& x) const
{
std::cout << "string, val=" << x << '\n';
}
};
IntStr a(42), b("meow");
Visitor v;
std::visit(v, a);
std::visit(v, b);
std::reduce()
(C++17). std::accumulate()
. std::accumulate()
.
template<class InputIt, class T, class BinOper>
T accumulate(InputIt first, InputIt last, T init, BinOper oper);
BinOper
тАФ ,
T f(T t, S s);
T
тАФ , S
тАФ , T
. , , T
S
, . , , . init
. , C++17 std::reduce()
, , .
template<class ExecutionPolicy,
class InputIt, class T, class BinOper>
T reduce(ExecutionPolicy&& policy,
InputIt first, InputIt last, T init, BinOper oper);
BinOper
std::accumulate()
тАФ , BinOper
:
T f(T t, S s);
T f(S s1, S s2);
T f(T t1, T t2);
. - C-
C- тАФ , тАФ T*
const T*
, T
(char
, wchar_t
, etc). std::hash<>
, std::less<>
std::equal_to<>
, , . .
#include <functional>
template <class T>
inline void hash_combine(std::size_t& seed, const T& v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 +
(seed << 6) + (seed >> 2);
}
#include <cstring>
namespace std
{
template <>
struct hash<const char*>
{
size_t operator()(const char* str) const
{
std::size_t hash = 0;
for (; *str; ++str)
{
hash_combine(hash, *str);
}
return hash;
}
};
template <>
struct equal_to<const char*>
{
bool operator()(const char* x, const char* y) const
{
return strcmp(x, y) == 0;
}
};
template <>
struct less<const char*>
{
bool operator()(const char* x, const char* y) const
{
return strcmp(x, y) < 0;
}
};
}
hash_combine()
тАФ Boost. -.
, , C- - .
#include <cstring>
const char* cc[] = { "one", "two", "three", "four" };
std::sort(cc, cc + _countof(cc),
[](const char* x, const char* y)
{ return std::strcmp(x, y) < 0; });
[рдЬреЛрд╕рдЯрд┐рд╕]
рдЬреЛрд╕рд╛рдЯрд┐рд╕, рдирд┐рдХреЛрд▓рд╛рдИ рдПрдоред рд╕реАред + рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп: рд╕рдВрджрд░реНрдн рдЧрд╛рдЗрдб, рджреНрд╡рд┐рддреАрдп рд╕рдВрд╕реНрдХрд░рдг: рдкреНрд░рддрд┐ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ - рдПрдоред: рдПрд▓рдПрд▓рд╕реА тАЬрдЖрдИ.рдбреА. рд╡рд┐рд▓рд┐рдпрдореНрд╕ ", 2014.
[рдбреЗрд╣рд░реНрд╕реНрдЯ]
рдбреЗрд╣реБрд░реНрд╕реНрдЯ, рд╕реНрдЯреАрдлрди рдХреЗред рдлрд┐рд╕рд▓рди рд╕реНрдерд╛рдиреЛрдВ рд╕реА ++ред рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреЗрдВ ред: рдкреНрд░рддрд┐ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ - рдПрдо .: рдбреАрдПрдордХреЗ рдкреНрд░реЗрд╕, 2012.
[
рдореЗрдпрд░реНрд╕ 1] рдореЗрдпрд░реНрд╕, рд╕реНрдХреЙрдЯред C ++ рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдЙрдкрдпреЛрдЧред 55 рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ ред: рдкреНрд░рддрд┐ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ - рдПрдо .: рдбреАрдПрдордХреЗ рдкреНрд░реЗрд╕, 2014.
[рд╕рдЯрд░ 1]
рд╕рдЯрд░, рдХреЛрдЯ рдСрдл рдЖрд░реНрдореНрд╕ред рд╕реА ++ рдореЗрдВ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди ред: рдкреНрд░рддрд┐ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ - рдПрдо: рдПрд▓рдПрд▓рд╕реА тАЬрдЖрдИ.рдбреА. рд╡рд┐рд▓рд┐рдпрдореНрд╕, 2015ред