Особенности C ++ 20
C ++ имеет традицию вводить новые улучшения и функции каждые 3 года в виде стандарта. Поскольку последний стандарт был выпущен в 2017 году как C ++ 17, C ++ 20 станет последним стандартом. Ниже приведены некоторые основные функции C ++ 20:
- Библиотека концепций C ++
- 3-сторонние сравнения
- Карта содержит
- Цикл for на основе диапазона
- Новые идентификаторы (импорт, модуль)
- Библиотека календаря и часового пояса
- std :: строковые функции
- Ограниченный / неограниченный массив
- std :: to_array
- Вероятные и маловероятные атрибуты
Библиотека концепций C ++ :
Библиотека концепций предоставляет определения основных концепций библиотеки, которые можно использовать для выполнения проверки аргументов шаблона во время компиляции и выполнения диспетчеризации функций на основе свойств типов. Эти концепции обеспечивают основу для образовательных рассуждений в программах.
В этом разделе около 15 понятий, которые не требуют пояснений. Эти концепции выражают отношения между типами, классификациями типов и фундаментальными свойствами типов.
Определено в заголовке <concepts> Определено в пространстве имен std
- интегральный : указывает, что тип является целочисленным типом.
- signed_integral : указывает, что тип является целочисленным типом со знаком.
- unsigned_integral : указывает, что тип является целочисленным беззнаковым типом.
- float_point : указывает, что тип является типом с плавающей запятой.
- same_as : указывает, что тип совпадает с другим типом.
- производный_фром : указывает, что тип является производным от другого типа.
- convertible_to : указывает, что тип может быть неявно преобразован в другой тип.
- common_with : указывает, что два типа имеют общий тип.
Синтаксис:
template<class T>
concept integral = is_integral_v<T>;template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;template<class T>
concept unsigned_integral = integral<T> && !signed_integral<T>;template<class T>
concept floating_point = is_floating_point_v<T>;
3-сторонние сравнения :
Выражения оператора трехстороннего сравнения имеют вид:
lhs <=> rhs
Оператор космического корабля выглядит как <=>, а его официальное название в C ++ - это оператор трехстороннего сравнения . Он называется так, потому что он используется для сравнения двух объектов, а затем сравнения этого результата с 0:
(x <=> y) <0 верно, если x <y (x <=> y)> 0 истинно, если x> y (x <=> y) == 0 истинно, если x и y равны / эквивалентны.
Оператор трехстороннего сравнения позволяет выражать не только порядок и равенство между объектами, но и характеристики отношений. Оператор космического корабля - очень долгожданное дополнение к C ++. Это дает нам больше выразительности в том, как определять наши отношения, позволяет нам писать меньше кода для их определения и позволяет избежать некоторых ошибок производительности, связанных с ручной реализацией одних операторов сравнения с точки зрения других.
Программа 1:
C ++
// C++ program to illustrate the // above concepts #include <bits/stdc++.h> #include <compare> using namespace std; // Driver Code int main() { int a = 91, b = 110; auto ans1 = a <= > b; if (ans1 < 0) { cout << "a < b
" ; } else if (ans1 == 0) { cout << "a == b
" ; } else if (ans1 > 0) { cout << "a > b
" ; } vector< int > v1{ 3, 6, 9 }; vector< int > v2{ 3, 6, 9 }; auto ans2 = v1 <= > v2; if (ans2 < 0) { cout << "v1 < v2
" ; } else if (ans2 == 0) { cout << "v1 == v2
" ; } else if (ans2 > 0) { cout << "v1 > v2
" ; } cout << endl; } |
Выход:
Карта / набор содержит :
Синтаксис:
std::map<Key, T, Compare, Allocator>::contains
std::set<T>::contains
Это дает гораздо более простой способ проверить, присутствует ли ключ в ассоциативном контейнере (наборе или карте) в C ++ 20. Он заменяет встроенную функцию поиска.
Программа 2:
C ++
// C++ program to illustrate the // above concepts #include <iostream> #include <map> // Driver Code int main() { // Map std::map< int , char > M = { { 1, 'a' }, { 2, 'b' } }; // Check if M has key 2 if (M.contains(2)) { std::cout << "Found
" ; } else { std::cout << "Not found
" ; } return 0; } |
Выход:
Цикл for на основе диапазона с инициализацией :
Цикл for на основе диапазона изменен в C ++ 17, чтобы позволить выражениям begin () и end () быть разных типов, а в C ++ 20 введен оператор init для инициализации переменных в области видимости цикла. . Это позволяет нам инициализировать контейнер, который мы хотим перебрать в самом объявлении диапазона.
Синтаксис:
for (init-statement(optional) range_declaration : range_expression)
{
/* loop body */
}
Программа 3:
C ++
// C++ program to illustrate the // above concepts #include <iostream> using namespace std; // Driver Code int main() { for (std::vector v{ 1, 2, 3 }; auto & e : v) { std::cout << e; } } |
Выход:
Новые идентификаторы (импорт, модуль) :
- Модули помогают разделить большой объем кода на логические части. Модули обещают более быстрое время компиляции, изоляцию макросов и делают файлы заголовков избыточными.
- Они выражают логическую структуру кода и помогают избавиться от уродливого обходного пути макросов. Модули ортогональны пространствам имен. Не имеет значения, в каком порядке вы импортируете модуль.
- Модули позволяют вам выразить логическую структуру вашего кода. Вы можете явно указать имена, которые следует экспортировать или нет. Кроме того, вы можете объединить несколько модулей в более крупный модуль и предоставить их в виде логического пакета.
- С модулями теперь нет необходимости разделять исходный код на интерфейс и часть реализации.
Программа 4:
C ++
// C++ program to illustrate the // above concepts // helloworld.cpp module declaration export module helloworld; // Import declaration import<iostream>; // Export declaration export void hello() { std::cout << "Hello world!
" ; } |
C ++
// main.cpp import declaration import helloworld; // Driver Code int main() { hello(); } |
Выход:
Библиотека календаря и часового пояса :
Библиотека хронографов C ++ 11/14 была расширена функцией календаря и часового пояса. Календарь состоит из типов, которые представляют год, месяц, день рабочего дня или n-й день недели месяца. Эти элементарные типы можно комбинировать со сложными типами, например, year_month , year_month_day , year_month_day_last , years_month_weekday и year_month_weekday_last . Оператор «/» перегружен для удобного указания моментов времени. Вдобавок в C ++ мы получим 20 новых литералов: d для дня и y для года.
Благодаря расширенной библиотеке chrono легко реализовать следующие функции:
- Получите последний день месяца.
- Получите количество дней между двумя датами.
- Печать текущего времени в различных часовых поясах.
Синтаксис:
Определено в заголовке <chrono> Определено в пространстве имен std :: chrono
Пример:
автоматическая дата1 = 2020г / сен / 8; auto date2 = 21d / oct / 2018; auto date3 = 27 января / 2019;
std :: строковые функции :
end_with («суффикс»): проверяет, заканчивается ли строка заданным суффиксом.
start_with («префикс»): проверяет, начинается ли строковое представление с заданным префиксом.
Программа 5:
C ++
// C++ program to illustrate the // above concepts #include <iostream> using namespace std; // Driver Code int main() { std::string str = "GeeksforGeeks" ; // Check string str starts_with Geeks if (str.starts_with( "Geeks" )) { std::cout << "true" << endl; } else { std::cout << "false" << endl; } // Check string str ends_with Geeks if (str.ends_with( "for" )) { std::cout << "true" << endl; } else { std::cout << "false" << endl; } } |
Выход:
Ограниченный / неограниченный массив :
- Он проверяет, является ли T типом массива с неизвестной границей, и предоставляет значение константы члена, равное true , если T является типом массива с неизвестной границей. В противном случае значение равно false .
- Он проверяет, является ли T типом массива с известной границей, и предоставляет значение константы члена, равное true , если T является типом массива с известной границей. В противном случае значение равно false .
Программа 6:
C ++
// C++ program to illustrate the // above concepts #include <iostream> #include <type_traits> // Class A class A { }; // Driver Code int main() { std::cout << std::is_unbounded_array_v<A> << '
' ; std::cout << std::is_unbounded_array_v<A[3]> << '
' ; std::cout << std::is_unbounded_array_v< int []> << '
' ; std::cout << std::is_unbounded_array_v< int > << '
' ; std::cout << std::is_bounded_array_v<A> << '
' ; std::cout << std::is_bounded_array_v<A[3]> << '
' ; std::cout << std::is_bounded_array_v< float > << '
' ; std::cout << std::is_bounded_array_v< int > << '
' ; } |
Выход:
std :: to_array :
Он преобразует данный массив / «подобный массиву» объект в std :: array. Он создает std :: array из одномерного встроенного массива a . Элементы std :: array инициализируются копированием из соответствующего элемента a . Копирование или перемещение многомерного встроенного массива не поддерживается.
Программа 7:
C ++
// C++ program to illustrate the // above concepts #include <iostream> using namespace std; // Driver Code int main() { // Returns std::array<char, 5> std::to_array( "Geeks" ); std::to_array< int >( { 1, 2, 3 }); int a[] = { 1, 2, 3 }; // Returns std::array<int, 3>` std::to_array(a); } |
вероятные и маловероятные атрибуты :
Он дает оптимизатору подсказку о том, что тело помеченного оператора, скорее всего, или маловероятно, будет выполнено. Оба атрибута позволяют подсказывать оптимизатору, более или менее вероятен путь выполнения.
Программа 8:
C ++
// C++ program to illustrate the // above concepts #include <iostream> using namespace std; // Driver Code int main() { int n = 40; [[likely]] if (n < 100) { cout << n * 2; } [[unlikely]] while (n > 100) { n = n / 2; cout << n << endl; } n = 500; [[likely]] if (n < 100) { cout << n * 2; } [[unlikely]] while (n > 100) { n = n / 2; cout << n << endl; } return 0; } |
Выход:
Ссылки : C ++ 20, Справочник по CPP.