# $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 v; //push_back работает амортизированно за O(1), но гарантируется за O(n) //аналогично string без + и += .shrink_to_fit() .clear() //просто делает из старых элементов ub, но память никак не освобождает .reserve(n) //предывделить память до n, но не кладет туда элементы (обращение туда все еще ub) .resize(n, x) //дропунть лишнее, если есть, если нет, то заполнить все остальное нулями .capacity() //size под выделенную память std::list l; //useless std::forward_list fl; //useless std::deque d; //страшная вещь внутри, которую нужно будет реализовать std::stack s; //deque внутри std::queue q; //deque внутри std::priority_queue pq; //deque с make_heap-ом внутри std::map m; //rbt m.at(key); //возвращает exception, если нет ключа m.find(key); //возвращает итератор или m.end, если не находит m.insert(pair); erase(map::iter); std::multimap mm; //это multiset, который map......... std::unordered_map 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 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() { ; } ```