127 lines
4.1 KiB
Markdown
127 lines
4.1 KiB
Markdown
# $I$. Introduction to C++
|
||
## § 1.2 Types and their supported operations.
|
||
|
||
static typization $:=$ тип переменной определяется на этапе компиляции
|
||
|
||
Integral types:
|
||
```C++
|
||
int x; //4
|
||
long x; //4
|
||
long long x; //8
|
||
short x; //2
|
||
char x; //? 1
|
||
bool x; //?? 1
|
||
int8_t x;
|
||
int16_t x;
|
||
int32_t x;
|
||
int64_t x; //стандартизованные типы про которые гарантируется их ширина
|
||
int128_t x; //есть аналоги с u
|
||
std::byte x; //аналогично char
|
||
size_t x; //==ull
|
||
```
|
||
Floating point types:
|
||
```C++
|
||
float x; //4b
|
||
double x; //8b
|
||
long double x; //16b
|
||
```
|
||
Хранятся они в формате sign (1 bit) mantissa exponent, то есть число хранится как mantissa * 2^exponent * sign
|
||
|
||
Все, что выше - это фундаментальные типы. Рассмотрим что-то более комплексное
|
||
```C++
|
||
std::string s = "abc";
|
||
s[1] == 'b';
|
||
s[3] == (char)0; //string - это null termindated string - после данных стандарт гарантирует присутствие символа 0
|
||
s[4]; //ub
|
||
.at()
|
||
+ +=
|
||
.push_back()
|
||
.pop_back()
|
||
.front()
|
||
.back()
|
||
.size()
|
||
std::vector<int> v;
|
||
//push_back работает амортизированно за O(1), но гарантируется за O(n)
|
||
//аналогично string без + и +=
|
||
.shrink_to_fit()
|
||
.clear()
|
||
//просто делает из старых элементов ub, но память никак не освобождает
|
||
.reserve(n)
|
||
//предывделить память до n, но не кладет туда элементы (обращение туда все еще ub)
|
||
.resize(n, x)
|
||
//дропунть лишнее, если есть, если нет, то заполнить все остальное нулями
|
||
.capacity()
|
||
//size под выделенную память
|
||
std::list<int> l; //useless
|
||
std::forward_list<int> fl; //useless
|
||
std::deque<int> d; //страшная вещь внутри, которую нужно будет реализовать
|
||
std::stack<int> s; //deque внутри
|
||
std::queue<int> q; //deque внутри
|
||
std::priority_queue<int> pq; //deque с make_heap-ом внутри
|
||
std::map<int, int> m; //rbt
|
||
m.at(key); //возвращает exception, если нет ключа
|
||
m.find(key); //возвращает итератор или m.end, если не находит
|
||
m.insert(pair<key, val>);
|
||
erase(map::iter);
|
||
|
||
std::multimap<key, val> mm; //это multiset, который map.........
|
||
std::unordered_map<key, val> um; //хэш-таблица
|
||
//работает В СРЕДНЕМ (не амортизированно) за O(1)
|
||
//то есть гарантируется, что работает за O(1) на рандомном наборе данных, а амортизированно - это значит, что работает быстро гарантированно
|
||
std::istream is; //поток ввода
|
||
std::ostream os; //поток вывода
|
||
```
|
||
"Эффективность дороже безопасности". Любая проверка на ub отсутствует, потому что это дорого).
|
||
|
||
Литералы
|
||
```C++
|
||
5u;
|
||
1'000'000'057;
|
||
0.2f;
|
||
"abc";
|
||
'a';
|
||
//integer promotions - это когда ты складываешь int и long long, то получится long long и все будет корректно
|
||
//Есть аналогичное floating point promotion
|
||
//int + uint = uint
|
||
0xff == 255; //16-иричный
|
||
0123 == 83; //8-иричный
|
||
0b101 == 5; //2-ичный
|
||
```
|
||
|
||
## §1.1 Знакомство с терминалом
|
||
```
|
||
pwd - print working directory
|
||
cd - вернуться в предыдущее пространство
|
||
```
|
||
|
||
|
||
## §1.3 Declarations, definitions and scopes.
|
||
На глобальном уровне (вне какой-либо другой сущности) все действия - это объявления чего либо (класса, функции, переменной etc)
|
||
|
||
```C++
|
||
#include <iostream>
|
||
|
||
int a;
|
||
|
||
void f(int x);
|
||
|
||
class C;
|
||
struct S;
|
||
enum E;
|
||
union U;
|
||
|
||
namespace N {
|
||
int x;
|
||
}
|
||
|
||
namespace N {
|
||
int y;
|
||
}
|
||
|
||
using ll = long long;
|
||
|
||
int main() {
|
||
;
|
||
}
|
||
```
|