pandoc-pages/pages/mipt_cxx1/01_imported.md

127 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# $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() {
;
}
```