Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820

std::all_of, std::any_of, std::none_of

07.06.2024, 19:21. Показов 1179. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу проверить, что не все символы в строке цифры.

можно проверить так:

C++
1
if (!std::all_of(s.cbegin(), s.cend(), isdigit))
или так

C++
1
if (!std::all_of(s.cbegin(), s.cend(), ::isdigit))
Однако, мне кажется, что в целях производительности лучше проверять не на то, что все цифры, а на то, есть ли хоть одна не цифра.

Это можно сделать так:

C++
1
if (std::any_of(s.cbegin(), s.cend(), [](auto& i){return !std::isdigit(i);}))
Однако, интересует, есть ли более короткий вариант для отрицания isdigit вместо лямбды, наподобие того, что выше ?

Т.е. как сделать отрицание для UnaryPred p?

***
- std::strtol, std::strtoll не предлагать
- обычный цикл не предлагать
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2024, 19:21
Ответы с готовыми решениями:

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

Поиск в std::vector < std::pair<UInt32, std::string> >
Подскажите пожалуйста, как осуществить поиск элемента в std::vector &lt; std::pair&lt;UInt32, std::string&gt; &gt; по ключу, а...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

19
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
07.06.2024, 19:33
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Цитата Сообщение от Royal_X Посмотреть сообщение
Т.е. как сделать отрицание для UnaryPred p?
std::unary_negate std::not1
https://en.cppreference.com/w/... ional/not1

Но трудно сказать, "лучше" ли это просто явной лямбды...
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 19:45  [ТС]
TheCalligrapher, еще и <functional> нужно подключать. Значит, оставлю лямбду.

А вообще, может быть обычный цикл оставлю. Не понимаю, в чем преимущество std::all_of, std::any_of, std::none_of ? Ну кроме ExecutionPolicy, который я не собираюсь использовать.

Мне просто cppcheck порекомендовал))
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
07.06.2024, 19:50
Цитата Сообщение от Royal_X Посмотреть сообщение
Не понимаю, в чем преимущество std::all_of, std::any_of, std::none_of ?
В том, что это теперь именованная конструкция, применение каковой существенно повышает читаемость кода. Часто повторяющиеся примитивы нужно оформлять в виде именованных конструкций, даже если эти примитивы компактны.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 19:50  [ТС]
TheCalligrapher, я тут посмотрел, что в своем коде (наверное, вы поняли, что речь идет о библиотеке для работы с длинными целыми числами, вопросами о которой я захламил форум) я использую 3 заголовка

#include <string>
#include <algorithm>
#include <cctype>

думаю, что можно избавиться от двух последних. algorithm использую для реверса строки std::reverse, а cctype для isdigit. Строку можно реверснуть и другими способами, а isdigit я свой напишу.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
07.06.2024, 19:50
Цитата Сообщение от Royal_X Посмотреть сообщение
Строку можно реверснуть и другими способами, а isdigit я свой напишу.
Жуть
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 19:52  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Жуть
т.е. не нужно избавляться от этих заголовков?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.06.2024, 19:54
Цитата Сообщение от Royal_X Посмотреть сообщение
думаю, что можно избавиться от двух последних.
Все через это проходят, пройдет
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 19:56  [ТС]
DrOffset, я просто подумал, что если потом создам статическую библиотеку, то чем больше заголовков я буду использовать, то тем набухнет размер.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.06.2024, 19:58
Royal_X, что не используется, то код не раздувает.
Разве что кроме iostreams. Из-за глобальных переменных cin/cout/cerr.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 19:59  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
что не используется, то код не раздувает.
ну так я об этом и пишу. я ж не знаю, как работает any_of, isdigit, reverse. Возможно, каждая функция подтягивает за собой другие, а те еще одни... Вот и думаю, а не лучше ли самому написать?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.06.2024, 20:02
Цитата Сообщение от Royal_X Посмотреть сообщение
ну так я об этом и пишу. я ж не знаю, как работает any_of, isdigit, reverse. Возможно, каждая функция подтягивает за собой другие, а те еще одни... Вот и думаю, а не лучше ли самому написать?
Оно все инлайнится, как правило. Код мало отличается от того есть ли эти функции или нет. isdigit только из библиотеки C, потому останется вызовом. Остальное все встраивается без остатка.

Ну хочешь - пиши. Все через это проходят, я ж говорю. Переболеешь, потом.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 20:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну хочешь - пиши.
я ж не прям горю желанием, чтобы писать. Я просто боюсь обратной ситуации. Чтобы потом опытные программисты не посмотрели и сказали, мол я идиот что ли, нах я подключал заголовок ради одной функции, которую можно самому писать? Если так не скажут, значит оставлю эти заголовки.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.06.2024, 20:17
Royal_X, опытные тебе говорят, что читаемость важнее
Кроме того, опытные скажут, что использование проверенных функций с известным контрактом лучше (с точки зрения предсказания всех ситуаций, в том числе потери производительности и т.д.), чем велосипеды.

Добавлено через 8 минут
Royal_X, добавлю,
Допустим, ты написал код на стандартных средствах, потом написал к нему тесты. Все проверил, все работает. Но, допустим, оказалось медленно. Дальше у тебя очень мало работы осталось. Сложность стандартных функций известна, поведение и ограничения их известны. Попрофилировал код, выявил слабое место и точечно завелосипедил место замедления. Коммент написал. Все, проблема решена, прогнал по-новой тесты, все ок.

А если весь код - это велосипед - даже не понятно что трогать нужно, как повлияет замена того или другого элемента алгоритма - фиг знает. Все надо каждый раз с нуля проверять. Еще и баги в велосипедах бывают, которые сразу не видно.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 20:33  [ТС]
DrOffset, тогда может убрать isdigit и использовать strtol? TheCalligrapher вроде вчера писал, что этой функцией можно проверять даже длинные строки. Мне нужно проверить только, не нужно конвертировать в long.

If successful, an integer value corresponding to the contents of str is returned.
If the converted value falls out of range of corresponding return type, a range error occurs (setting errno to ERANGE) and LONG_MAX, LONG_MIN, LLONG_MAX or LLONG_MIN is returned.
If no conversion can be performed, ​0​ is returned.
т.е. даже если строка длинная, но там число, то не будет возвращаться 0. Я вот получается, что могу проверить на 0.

Добавлено через 12 минут
DrOffset, а не, strtol не подходит

данная функция считает нормальной числовой строкой следующие варианты

"00000001" -> когда нули перед числом
"1hffghj" -> т.е. когда мусор после числа

это мне не подходит
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.06.2024, 20:42
Royal_X, мусор после числа ей можно же обработать. Анализируешь указатель после работы функции. А вот ведущие нули - да.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
07.06.2024, 20:48
Цитата Сообщение от Royal_X Посмотреть сообщение
данная функция считает нормальной числовой строкой следующие варианты
Сколько раз ни повторяй, все как об стенку горох...

"Само сконвертированное значение в задаче проверки формата никакой роли не играет. Неважно, что функция вернет. Проверка формата делается исключительно на основе анализа финального указателя (второй параметр) после вызова функции"

Как проверить является ли строковая переменная числом?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6222 / 2922 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
07.06.2024, 21:02  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот и все. А дальше уже идет тонкая настройка под особенности задачи, которые ТС, как водится, не оговорил: разрешаются ли ведущие пробелы? Разрешаются ли замыкающие пробелы? Разрешается ли знак? и т.д.
если все придется настраивать (знак, ведущие нули и прочее), какой смысл вообще это использовать. Я и без этого барахла могу сделать проверки в несколько строк.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.06.2024, 22:13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
std::unary_negate std::not1
https://en.cppreference.com/w/... ional/not1
Но трудно сказать, "лучше" ли это просто явной лямбды...
Теперь понятны ваши сомнения :
(deprecated in C++17)
(removed in C++20)
В 20 стандарте так же отсутствуют альтернативы как для группы <codecvt> ?
Deprecated in C++11 and removed in C++17
Deprecated in C++17 and removed in C++20
выглядит не очень ...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
07.06.2024, 23:22
SmallEvil, std::not_fn?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2024, 23:22
Помогаю со студенческими работами здесь

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Std::begin() ,std::end(),std::copy
...// int main() { std::vector&lt;double&gt; data;//Работает cout &lt;&lt; std::begin(data); double *data=new double; ...

std::shared_ptr и std::dynamic_pointer_cast, std::static_pointer_cast и т.д
Добрый день. Появился вопрос, операции std::shared_ptr, std::dynamic_pointer_cast, std::static_pointer_cast, std::const_pointer_cast,...

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru