С++ в относительно новых стандартах

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 27 янв 2021, 03:22

Olej писал(а):
26 янв 2021, 20:36
Точнее даже, мне нужна не просто (только) функция аналог sleep() только миллисекундного диапазона, а 2 функции - пассивного и активного (подобно тому как работает spin-блокировка) ожидания!
Потому что они могут влиять на поведение многопоточных приложений радикально р
И окончательно 2 варианта, существующие раздельно для отладки, слиты в общий файл wait.cc для сравнений ... там ничего нет отличающегося, поэтому он не приводится. Он нужен для сравнений.

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./wait .01
the requested delay is 10 milliseconds
wait_p1 : delay was 10.068 milliseconds
wait_p2 : delay was 10.129 milliseconds
wait_p3 : delay was 10.085 milliseconds
wait_a1 : delay was 9.36 milliseconds

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./wait .1
the requested delay is 100 milliseconds
wait_p1 : delay was 100.079 milliseconds
wait_p2 : delay was 100.097 milliseconds
wait_p3 : delay was 100.111 milliseconds
wait_a1 : delay was 119.988 milliseconds

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./wait .5
the requested delay is 500 milliseconds
wait_p1 : delay was 500.102 milliseconds
wait_p2 : delay was 500.111 milliseconds
wait_p3 : delay was 500.118 milliseconds
wait_a1 : delay was 508.488 milliseconds
И ещё он нужен для рассмотрения эффектов изменений мягкости Linux-очерёдности nice + возможности запуска с режимом жёсткого realtime диспетчирования приоритетов...
Но особы эффектов, пока, при предварительной отладке, не наблюдается:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ sudo nice -n -19 ./wait .2
the requested delay is 200 milliseconds
wait_p1 : delay was 200.084 milliseconds
wait_p2 : delay was 200.101 milliseconds
wait_p3 : delay was 200.118 milliseconds
wait_a1 : delay was 234.896 milliseconds

olej@nvme:~/2021/OWN_TEST.codes/wait$ sudo nice -n -19 ./wait .2
the requested delay is 200 milliseconds
wait_p1 : delay was 200.099 milliseconds
wait_p2 : delay was 200.116 milliseconds
wait_p3 : delay was 200.241 milliseconds
wait_a1 : delay was 217.131 milliseconds

olej@nvme:~/2021/OWN_TEST.codes/wait$ sudo nice -n -19 ./wait .5
the requested delay is 500 milliseconds
wait_p1 : delay was 500.24 milliseconds
wait_p2 : delay was 500.076 milliseconds
wait_p3 : delay was 500.103 milliseconds
wait_a1 : delay was 516.959 milliseconds

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ sudo chrt -r 99 ./wait .1
the requested delay is 100 milliseconds
wait_p1 : delay was 100.053 milliseconds
wait_p2 : delay was 100.041 milliseconds
wait_p3 : delay was 100.058 milliseconds
wait_a1 : delay was 123.647 milliseconds

olej@nvme:~/2021/OWN_TEST.codes/wait$ sudo chrt -r 99 ./wait .2
the requested delay is 200 milliseconds
wait_p1 : delay was 200.031 milliseconds
wait_p2 : delay was 200.043 milliseconds
wait_p3 : delay was 200.059 milliseconds
wait_a1 : delay was 236.747 milliseconds

olej@nvme:~/2021/OWN_TEST.codes/wait$ sudo chrt -r 99 ./wait .5
the requested delay is 500 milliseconds
wait_p1 : delay was 500.032 milliseconds
wait_p2 : delay was 500.042 milliseconds
wait_p3 : delay was 500.062 milliseconds
wait_a1 : delay was 533.617 milliseconds
Вложения
wait.cc
(3.08 КБ) 21 скачивание

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 01 фев 2021, 21:50

Преобразования типов в стиле C++ ... вещь достаточно хорошо известная.
Но вот неплохое напоминание как это делается в C++ в отличие от C - простенько и "на пальцах": Еще раз про приведение типов в языке С++ или расстановка всех точек над cast
13 сентября 2015 в 01:22
- const_cast;
- reinterpret_cast;
- static_cast;
- dynamic_cast;
Там в тексте есть 1 хороший пример (все остальные примеры там формальные и неинтересные), вот это:

Код: Выделить всё

#include <iostream>
using namespace std;

void f(int *x)
{
    cout << __PRETTY_FUNCTION__ << endl;
}

void f(const int *x)
{
    cout << __PRETTY_FUNCTION__ << endl;
}

int main()
{
    int x = 5;
    int *px = &x;

    f(px);
    f(const_cast<const int*>(px));

    return 0;
}
(там ещё интересное: __PRETTY_FUNCTION__)
Выполнение:

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/cast$ ./const
void f(int*)
void f(const int*)
P.S. В принципе, я всегда считал, что в большинстве случаев достаточно и приведений типов в стиле C, типа (void*)3.14 :lol: ... хотя в больших громоздких проектах C++ приведение позволит сохранить жёсткий контроль типов.
Но мой работодатель считает, что имеют право жить только приведения в стиле C++ :-?
Вложения
cast.tgz
(559 байт) 21 скачивание

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 03 фев 2021, 04:39

Olej писал(а):
26 янв 2021, 20:36
Понадобилось ввести короткие задержки (миллисекундного диапазона) во избежание гонок в многопоточном проекте...
Что там у нас есть в C++? ... такого что использует POSIX API (язык C, Linux), и что не использует....
Ещё одна общеупотребимая задача связанная с временем: расставить метки времени начала и конца выполнения фрагмента и определить, в конечном итоге, время его выполнения ... это может быть миллисекундный или даже микросекундный диапазон - естественно, это не используя POSIX API Linux, это я знаю и умею, но вот как-раз без этого. ;-)
Вот на эту тему пара полезных публикаций:
Замерить время работы функции на С++
Работа с датой и временем на С++
Ну и конечно официальный справочник C++ по этой теме: <chrono>

Всё это хозяйство действует с C++11 и расширено в C++14.

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 03 фев 2021, 04:40

Olej писал(а):
03 фев 2021, 04:39
расставить метки времени начала и конца выполнения фрагмента и определить, в конечном итоге, время его выполнения
В черновом варианте это может выглядеть так:

Код: Выделить всё

#include <iostream>
#include <chrono>
using namespace std;

void one_cycle( void )                        // функция одного цикла активной работы
{
        for( int i = 0, n = 0; i < 50; i++ )  // цикл произвольной активной работы
                n = ( n + 37 ) % 31;
}

int main( int argc, char *argv[] ) {
        long num = 10000;
        if (argc >1 && atol(argv[1]) > 0)
                num = atol(argv[1]);
        auto begin = chrono::steady_clock::now();
        for( int i = 0; i < num; i++ )
                one_cycle();
        auto end = chrono::steady_clock::now();

        chrono::duration<long, milli> elapsed_ms = chrono::duration_cast<chrono::milliseconds>(end - begin);
        printf( "elapsed time in milliseconds = %lu\n", elapsed_ms );

        auto elapsed_mls = std::chrono::duration_cast<chrono::milliseconds>(end - begin);
        cout << "elapsed time in milliseconds = " << elapsed_mls.count() << endl;
}
Показано 2 вариант: с а). printf(), меня больше интересует, для форматирования sprintf() и т.д. (это конечно тоже можно на стримах сделать) + б). чистый C++ вывод в выходной стрим.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ make
g++ -Wall -pedantic -std=c++14 duration.cc -o duration
duration.cc: In function ‘int main(int, char**)’:
duration.cc:21:44: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘std::chrono::duration<long int, std::ratio<1, 1000> >’ [-Wformat=]
   21 |  printf( "elapsed time in milliseconds = %lu\n", elapsed_ms );
      |                                          ~~^     ~~~~~~~~~~
      |                                            |     |
      |                                            |     std::chrono::duration<long int, std::ratio<1, 1000> >
      |                                            long unsigned int
А вот тут обратим внимание что "педантику" это не нравится ... и это нужно бы сделать чисто руками приведением типов...
Выполнение:

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration 10000
elapsed time in milliseconds = 3
elapsed time in milliseconds = 3

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration 100000
elapsed time in milliseconds = 39
elapsed time in milliseconds = 39

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration 1000000
elapsed time in milliseconds = 378
elapsed time in milliseconds = 378

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration 1000000
elapsed time in milliseconds = 388
elapsed time in milliseconds = 388

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration 10000000
elapsed time in milliseconds = 3824
elapsed time in milliseconds = 3824

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration 10000000
elapsed time in milliseconds = 3836
elapsed time in milliseconds = 3836
Вложения
duration.cc
(885 байт) 20 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 05 фев 2021, 17:00

Olej писал(а):
03 фев 2021, 04:40
В черновом варианте это может выглядеть так:
А ещё лучше и нагляднее к этому добавить:

1. контроль одних и тех же значений (интервалов) через POSIX API, через:

Код: Выделить всё

#include <time.h>
        struct timespec {
              time_t tv_sec;        // seconds
              long   tv_nsec;       // nanoseconds (0...999999999)
           };
или через:

Код: Выделить всё

#include <sys/time.h>
        struct timeval {
              time_t      tv_sec;     // seconds
              suseconds_t tv_usec;    // microseconds
           };
2. повысить заказанную точность операций chrono;

3. убрать неявное использование namespace std::, чтобы было нагляднее что откуда взялось;

4. заменить функцию активного тупого выполнения на анонимную лямбда-функцию (нам от неё больше ничего не надо);

Итого:

Код: Выделить всё

#include <iostream>
#include <chrono>
#include <sys/time.h>

/* struct timeval {
      time_t      tv_sec;     // seconds
      suseconds_t tv_usec;    // microseconds
   };
*/

int main( int argc, char *argv[] ) {
        long num = 10000;
        if (argc >1 && atol(argv[1]) > 0)
                num = atol(argv[1]);

        struct timeval tb, tf;
        gettimeofday( &tb, NULL );
        auto begin = std::chrono::steady_clock::now();
        for( int i = 0; i < num; i++ )
            [](void)->void{ for( int i = 0, n = 0; i < 50; i++ ) n = ( n + 37 ) % 31; };
        gettimeofday( &tf, NULL );
        auto end = std::chrono::steady_clock::now();

        std::chrono::duration<long, std::nano> elapsed_ms = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
        printf( "elapsed time in microseconds = %lu.%u\n", elapsed_ms / 1000, elapsed_ms % 1000);

        auto elapsed_mls = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
        std::cout << "elapsed time in microseconds = " << elapsed_mls.count() / 1000 << "." << elapsed_mls.count() % 1000 << std::endl;

        timersub( &tf, &tb, &tf );
        std::cout << "the same interval through POSIX API = " <<  tf.tv_sec << " sec. " << tf.tv_usec << " usec." << std::endl;
}

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 05 фев 2021, 17:06

Olej писал(а):
05 фев 2021, 17:00
Итого:
Компиляция этого хозяйства идёт с предупреждениями (нужно будет от них избавиться!):

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ make
g++ -Wall -pedantic -std=c++11 duration.std.cc -o duration.std
duration.std.cc: In function ‘int main(int, char**)’:
duration.std.cc:32:44: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘std::chrono::duration<long int, std::ratio<1, 1000000000> >’ [-Wformat=]
   32 |  printf( "elapsed time in microseconds = %lu.%u\n", elapsed_ms / 1000, elapsed_ms % 1000);
      |                                          ~~^        ~~~~~~~~~~~~~~~~~
      |                                            |                   |
      |                                            long unsigned int   std::chrono::duration<long int, std::ratio<1, 1000000000> >
duration.std.cc:32:47: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 3 has type ‘std::chrono::duration<long int, std::ratio<1, 1000000000> >’ [-Wformat=]
   32 |  printf( "elapsed time in microseconds = %lu.%u\n", elapsed_ms / 1000, elapsed_ms % 1000);
      |                                              ~^                        ~~~~~~~~~~~~~~~~~
      |                                               |                                   |
      |                                               unsigned int                        std::chrono::duration<long int, std::ratio<1, 1000000000> >
Но всё выполняется "на ура" ;-) :

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 1000
elapsed time in microseconds = 2.177
elapsed time in microseconds = 2.177
the same interval through POSIX API = 0 sec. 5 usec.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 1000
elapsed time in microseconds = 2.183
elapsed time in microseconds = 2.183
the same interval through POSIX API = 0 sec. 6 usec.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 10000
elapsed time in microseconds = 21.127
elapsed time in microseconds = 21.127
the same interval through POSIX API = 0 sec. 24 usec.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 100000
elapsed time in microseconds = 210.600
elapsed time in microseconds = 210.600
the same interval through POSIX API = 0 sec. 213 usec.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 1000000
elapsed time in microseconds = 2105.383
elapsed time in microseconds = 2105.383
the same interval through POSIX API = 0 sec. 2109 usec.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 10000000
elapsed time in microseconds = 21286.798
elapsed time in microseconds = 21286.798
the same interval through POSIX API = 0 sec. 21289 usec.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 100000000
elapsed time in microseconds = 213553.392
elapsed time in microseconds = 213553.392
the same interval through POSIX API = 0 sec. 213555 usec.

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/wait$ ./duration.std 1000000000
elapsed time in microseconds = 2125524.45
elapsed time in microseconds = 2125524.45
the same interval through POSIX API = 2 sec. 125526 usec.

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 06 фев 2021, 16:07

Olej писал(а):
05 фев 2021, 17:06
Компиляция этого хозяйства идёт с предупреждениями (нужно будет от них избавиться!):
Вот так:

Код: Выделить всё

#include <iostream>
#include <chrono>
#include <sys/time.h>

/* struct timeval {
      time_t      tv_sec;     // seconds
      suseconds_t tv_usec;    // microseconds
   };
*/

int main( int argc, char *argv[] ) {
        long num = 100000;
        if (argc >1 && atol(argv[1]) > 0)
                num = atol(argv[1]);

        struct timeval tb, tf;
        gettimeofday( &tb, NULL );
        auto begin = std::chrono::steady_clock::now();
        for( int i = 0; i < num; i++ )
            [](void)->void{ for( int i = 0, n = 0; i < 50; i++ ) n = ( n + 37 ) % 31; };
        gettimeofday( &tf, NULL );
        auto end = std::chrono::steady_clock::now();

        std::chrono::duration<long, std::nano> elapsed_ms = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
        printf( "elapsed time in microseconds = %lu.%lu\n", elapsed_ms.count() / 1000, elapsed_ms.count() % 1000);

        auto elapsed_mls = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
        std::cout << "elapsed time in microseconds = " << elapsed_mls.count() / 1000 << "."
                  << elapsed_mls.count() % 1000 << std::endl;

        timersub( &tf, &tb, &tf );
        std::cout << "the same interval through POSIX API = " <<  tf.tv_sec << " sec. " << tf.tv_usec << " usec." << std::endl;
}
Именно член-функция count() даёт счётчик накопленный в выбранной метрике duration - std::chrono::duration::count:
The representation value of the object as a count of periods.
rep is a member type, defined as an alias of its first class template parameter (Rep), which is an arithmetic type (or a class emulating an arithmetic type).
При самой педантичной компиляции ;-) - всё идёт чистенько, без варнингсов :

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ make
g++ -Wall -pedantic -std=c++11 duration.std.cc -o duration.std
Выполнение:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./duration.std 100000
elapsed time in microseconds = 227.54
elapsed time in microseconds = 227.54
the same interval through POSIX API = 0 sec. 230 usec.

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./duration.std 1000000
elapsed time in microseconds = 2292.297
elapsed time in microseconds = 2292.297
the same interval through POSIX API = 0 sec. 2295 usec.

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./duration.std 10000000
elapsed time in microseconds = 29918.705
elapsed time in microseconds = 29918.705
the same interval through POSIX API = 0 sec. 29921 usec.

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./duration.std 100000000
elapsed time in microseconds = 228806.725
elapsed time in microseconds = 228806.725
the same interval through POSIX API = 0 sec. 228809 usec.

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/wait$ ./duration.std 1000000000
elapsed time in microseconds = 2289995.543
elapsed time in microseconds = 2289995.543
the same interval through POSIX API = 2 sec. 289997 usec.
P.S. Самое внятное (и достаточное) описание библиотеки времени, что мне попадалось: Библиотека времени Chrono
Разработчики не посчитали нужным добавить человеко понятный вывод.
...
В грядущем стандарте С++20 функции форматирования даты/времени в chrono всё же были заявлены.
Вложения
duration.std.cc
(1.16 КБ) 21 скачивание

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 12 фев 2021, 02:24

Пришлось повозиться с множествами - проверять принадлежит ли некоторая величина к набору подобных (по типу)...
Мелочь, но там тоже есть интересные подробности.
Например, то что для set (множества) значения в нём являются ключами, они же сами являются и значениями ... как ключи они упорядочены, что делает поиск быстрее линейного.

Вот такой простейший пример, проще не бывает:

Код: Выделить всё

#include <iostream>
#include <set>

int main()
{
    std::set<int> example1 = {9, 1, 6, 5, 2};
    for (int x: example1)
        std::cout << x << " , ";
    std::cout << std::endl;

    std::set<int, std::greater<int>> example2 = {9, 1, 6, 5, 2};
    for (int x: example2)
        std::cout << x << " , ";
    std::cout << std::endl;
}
Исходное множество мы представляем значениями в произвольном, нам удобном, порядке {9, 1, 6, 5, 2}.
Но последовательный перебор нам повыбрасывает нам значения, содержащиеся в множестве, в самых разных порядках в зависимости как мы определили множество:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ g++ -Wall -pedantic -std=c++11 set2.cc -o set2
Я специально показал в каком стандарте C++ я компилирую программу.
И результат:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ ./set2
1 , 2 , 5 , 6 , 9 ,
9 , 6 , 5 , 2 , 1 ,
Вложения
set2.cc
(323 байт) 23 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 12 фев 2021, 02:34

Olej писал(а):
12 фев 2021, 02:24
Я специально показал в каком стандарте C++ я компилирую программу.
Ещё из интересных особенностей то, что API работы, особенно с контейнерами C++ значительно дополняется с развитием стандартов языка C++: C++98, C++03, C++11, C++14, C++17, C++20, C++23 :lol: :-o
Об этом подробнее здесь: C/C++ инструменты - версии ...
Когда элементарный код может компилироваться в одном стандарте, и перестать компилироваться в более раннем:
- C++17:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ g++ -Wall -pedantic -std=c++11 set.cc -o set
set.cc: In function ‘int main()’:
set.cc:10:20: error: ‘class std::set<int>’ has no member named ‘contains’
   10 |         if(example.contains(x)) {
      |                    ^~~~~~~~
- C++20:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/set$ g++ -Wall -pedantic -std=c++2a set.cc -o set
olej@nvme:~/2021/OWN_TEST.codes/set$ echo $?
0
Вложения
set.cc
(337 байт) 22 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 14939
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: С++ в относительно новых стандартах

Непрочитанное сообщение Olej » 15 фев 2021, 16:16

Olej писал(а):
12 фев 2021, 02:24
Пришлось повозиться с множествами - проверять принадлежит ли некоторая величина к набору подобных
Ещё раз о множествах и совместимости стандартов тоже...
Разные способы (3) проверки принадлежности множеству:

Код: Выделить всё

#include <iostream>
#include <set>

// https://en.cppreference.com/w/cpp/container/set/contains
int main()
{
        std::set<int> example = {1, 2, 3, 4};
        std::set<int>::iterator it;

        for(int x: {2, 5}) {
                std::cout << "count(" << x << ") = " << example.count(x) << std::endl;
                std::cout << "find(" << x << ") -> "
                          << (example.find(x) != example.end() ? "found" : "not found") << std::endl;
                std::cout << "contains(" << x << ") -> "
                          << (example.contains(x) ? "found" : "not found") << std::endl;
    }
}

Код: Выделить всё

olej@nvidia:~/2021_WORK/OWN_TEST.codes/set$ make
g++ -Wall -pedantic -std=c++2a set3.cc -o set3

olej@nvidia:~/2021_WORK/OWN_TEST.codes/set$ ./set3
count(2) = 1
find(2) -> found
contains(2) -> found
count(5) = 0
find(5) -> not found
contains(5) -> not found
Компиляция с опцией -std=c++2a, с ниже стандартном contains() вызовет ошибку!
Вложения
set3.cc
(526 байт) 20 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя