Особенности C ++ 20

Опубликовано: 16 Декабря, 2021

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.

Хотите узнать больше о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровней C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .