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

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

07.06.2024, 19:21. Показов 1099. Ответов 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
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
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
6149 / 2842 / 1040
Регистрация: 01.06.2021
Сообщений: 10,361
07.06.2024, 19:45  [ТС]
TheCalligrapher, еще и <functional> нужно подключать. Значит, оставлю лямбду.

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

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

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

думаю, что можно избавиться от двух последних. algorithm использую для реверса строки std::reverse, а cctype для isdigit. Строку можно реверснуть и другими способами, а isdigit я свой напишу.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
07.06.2024, 19:50
Цитата Сообщение от Royal_X Посмотреть сообщение
Строку можно реверснуть и другими способами, а isdigit я свой напишу.
Жуть
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6149 / 2842 / 1040
Регистрация: 01.06.2021
Сообщений: 10,361
07.06.2024, 19:52  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Жуть
т.е. не нужно избавляться от этих заголовков?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2024, 19:54
Цитата Сообщение от Royal_X Посмотреть сообщение
думаю, что можно избавиться от двух последних.
Все через это проходят, пройдет
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6149 / 2842 / 1040
Регистрация: 01.06.2021
Сообщений: 10,361
07.06.2024, 19:56  [ТС]
DrOffset, я просто подумал, что если потом создам статическую библиотеку, то чем больше заголовков я буду использовать, то тем набухнет размер.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2024, 19:58
Royal_X, что не используется, то код не раздувает.
Разве что кроме iostreams. Из-за глобальных переменных cin/cout/cerr.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6149 / 2842 / 1040
Регистрация: 01.06.2021
Сообщений: 10,361
07.06.2024, 19:59  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
что не используется, то код не раздувает.
ну так я об этом и пишу. я ж не знаю, как работает any_of, isdigit, reverse. Возможно, каждая функция подтягивает за собой другие, а те еще одни... Вот и думаю, а не лучше ли самому написать?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2024, 20:02
Цитата Сообщение от Royal_X Посмотреть сообщение
ну так я об этом и пишу. я ж не знаю, как работает any_of, isdigit, reverse. Возможно, каждая функция подтягивает за собой другие, а те еще одни... Вот и думаю, а не лучше ли самому написать?
Оно все инлайнится, как правило. Код мало отличается от того есть ли эти функции или нет. isdigit только из библиотеки C, потому останется вызовом. Остальное все встраивается без остатка.

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

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

А если весь код - это велосипед - даже не понятно что трогать нужно, как повлияет замена того или другого элемента алгоритма - фиг знает. Все надо каждый раз с нуля проверять. Еще и баги в велосипедах бывают, которые сразу не видно.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6149 / 2842 / 1040
Регистрация: 01.06.2021
Сообщений: 10,361
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2024, 20:42
Royal_X, мусор после числа ей можно же обработать. Анализируешь указатель после работы функции. А вот ведущие нули - да.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
07.06.2024, 20:48
Цитата Сообщение от Royal_X Посмотреть сообщение
данная функция считает нормальной числовой строкой следующие варианты
Сколько раз ни повторяй, все как об стенку горох...

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

Как проверить является ли строковая переменная числом?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6149 / 2842 / 1040
Регистрация: 01.06.2021
Сообщений: 10,361
07.06.2024, 21:02  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот и все. А дальше уже идет тонкая настройка под особенности задачи, которые ТС, как водится, не оговорил: разрешаются ли ведущие пробелы? Разрешаются ли замыкающие пробелы? Разрешается ли знак? и т.д.
если все придется настраивать (знак, ведущие нули и прочее), какой смысл вообще это использовать. Я и без этого барахла могу сделать проверки в несколько строк.
0
Заблокирован
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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru