static typization := тип переменной определяется на этапе компиляции
Integral types:
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:
float x; //4b
double x; //8b
long double x; //16b
Хранятся они в формате sign (1 bit) mantissa exponent, то есть число хранится как mantissa * 2^exponent * sign
Все, что выше - это фундаментальные типы. Рассмотрим что-то более комплексное
std::string s = "abc";
[1] == 'b';
s[3] == (char)0; //string - это null termindated string - после данных стандарт гарантирует присутствие символа 0
s[4]; //ub
s.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
.at(key); //возвращает exception, если нет ключа
m.find(key); //возвращает итератор или m.end, если не находит
m.insert(pair<key, val>);
m(map::iter);
erase
std::multimap<key, val> mm; //это multiset, который map.........
std::unordered_map<key, val> um; //хэш-таблица
//работает В СРЕДНЕМ (не амортизированно) за O(1)
//то есть гарантируется, что работает за O(1) на рандомном наборе данных, а амортизированно - это значит, что работает быстро гарантированно
std::istream is; //поток ввода
std::ostream os; //поток вывода
“Эффективность дороже безопасности”. Любая проверка на ub отсутствует, потому что это дорого).
Литералы
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-ичный
pwd - print working directory
cd - вернуться в предыдущее пространство
На глобальном уровне (вне какой-либо другой сущности) все действия - это объявления чего либо (класса, функции, переменной etc)
#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() {
;
}