diff --git a/src/14_templates.md b/src/14_templates.md index b6e799f..95c65e2 100644 --- a/src/14_templates.md +++ b/src/14_templates.md @@ -210,6 +210,13 @@ size_t size(T (&arr)[N]) { ``` Важный момент в non-type параметрах шаблона: **всё, что вы подставляете в шаблон, должно быть известно на этапе компиляции**. Потому что только на этапе компиляции существуют типы, в частности, шаблонные типы. +В *C++20* нестатический шаблонный параметр может быть объявлен как auto, позволяя выводить тип из аргумента. Например: +```cpp +template struct S { + static constexpr auto value = N; +}; +``` + ## Template template parameter. Хочется обёртку над контейнером. Зачем-то. ```c++ diff --git a/src/15_stl.md b/src/15_stl.md index 5c78659..6a6d61c 100644 --- a/src/15_stl.md +++ b/src/15_stl.md @@ -222,6 +222,10 @@ using reference = Reference; v.erase(it, v.end()); // чистим хвост, так как физический размер вектора остался тем же (подробнее на cppreference) ``` +В *C++20* ассоциативные контейнеры `(std::map, std::unordered_map, std::set, std::unordered_set)` получили метод `contains(key)`, который возвращает `bool`, проверяя наличие ключа. Это удобнее и читаемее, чем `count(key) > 0` или `find(key) != end()`. + +Начиная с *C++20*, для всех контейнеров появилась функция `std::erase_if`. Например, std::erase_if(v, pred); выполняет удаление за один вызов, что проще, чем комбинация `remove_if + erase`. + В *C++20* появился `operator<=>` (three-way comparison) сразу говорит, "меньше, равно или больше" и в возвращаемом значении говорит, какой *order* даёт (`partial`, `weak`, `strong`). Так же в *C++20* появились `range`, и какие-то алгоритмы в STL могут поменяться.