- 1
- 2
- 3
- 4
- 5
- 6
bool IsDigit(char cKey, const char *cKeys) {
for (int i = 0; i < strlen(cKeys); i++)
if (cKeys[i] == cKey)
return true;
return false;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1001
bool IsDigit(char cKey, const char *cKeys) {
for (int i = 0; i < strlen(cKeys); i++)
if (cKeys[i] == cKey)
return true;
return false;
}
стоп. а как соотносится название isDigit с проверкой наличия символа в строке
думаю, в зависимости от содержимого в cKeys подошло бы (ckey >= '0' && ckey <= '9') в лучшем случае и binary_search в худшем
char - символ,
unsigned/signed char - байт.
FB
> в зависимости от содержимого в cKeys
> в зависимости от содержимого в cKeys
только афтар знает что там
может сканкоды клавиш устройства
например 0x90, 0x93, 0x96, 0xA0, 0xA3, 0xA6 и т.д.
я всё это выше учел
маладец
а я не маладец
А в помойку его.
std::unordered_map
если бы ты намекнул о простом трюке - берем таблицу из 255 элементов bool и записываем в нее true туда, где элементы - "цифры", т.о. сводим определение "цифра"/"не цифра" к if (digits_table[passed_char]) - это бы еще имело право на жизнь
но не unordered_set, извини
Убрать до естественного вычисления хеша, данные подходящие.
>а уж по памяти явно проиграет непрерывному массиву из ~10 значений
Согласен.
>если бы ты намекнул о простом трюке - берем таблицу из 255 элементов bool
vector<bool>? Имеет право на жизнь. Компактно относительно.
отдельный вид программистов - крестодельфины - развиваются в изолированной экосистеме, и вмешательство STL в их скромную цивилизацию может привести к трагедии
поэтому ученые сегодня стараются только наблюдать, на будущее разрабатывая методики психокоррекции для возможной ассимиляции этого подвида среди обычных людей
Это что за мутант?
Мне почему-то представился дельфин (млекопитающие) с большим крестом на брюхе. Я один такой?
Говнецо то ещё...
писать что-то вроде:
делать такой метод в std::list - глупо, если программист так сильно хочет найти элемент в нем, значит его ничто не остановит сделать это в виде линейного std::find
ГК именно за это.
для ANSI C c учётом strlen может быть, и то там можно лучше написать. А в плюсах это вообще унылый не особо реюзабельный велосипед.
Пример использования со строками:
http://codepad.org/WqTdlt2N
Разумеется, такая реализация имеет ряд ограничений и может пригодится разве что внутри какой-нибудь библиотеки для работы с множеством различных структур-последовательностей. Алгоритм линейного поиска в массиве известного типа вы и сами можете написать. Хотя я бы использовал бинарный поиск и таблицы везде где это возможно.
а то насоветуешь щяс ему
над тарасом, реализовав рантайм-метапрограммирование даже в сишке с её сишкопроблемами
написал велосипед, где strlen каждую итерацию
кроме того чрезвычайно универсальный велосипед работает только с char, и конечно будет искать только по null-terminated массиву
покури boost::is_any_of() и другие вещи из algorithm - для базового поиска
тем, кому нужна действительно скорость для определения "число ли это", "пробел ли это", "пригоден ли символ для имени" - пользуются таблицами из 256 элементов, например смотри lookup-tables описанные в хвосте этого заголовка (честноспижженный rapidxml в недрах буста):
http://www.boost.org/doc/libs/1_48_0/boost/property_tree/detail/rapidxml.hpp
Для int как и было уже сказано есть int isdigit(int c)
Универсальность определялось той динамичностью, при которой добавив в массив cKeys ещё любые символы, можно было использовать ф-ю для разного вида ограничений ввода символов.
Ну, если конечно массив небольшой, то этот вариант вполне подойдёт.
Это модно.
I LOL'D
Нововведениями Си++ в сравнении с Си являются:
* поддержка объектно-ориентированного программирования;
* поддержка обобщённого программирования через шаблоны;
* дополнительные типы данных;
* исключения;
* пространства имён;
* встраиваемые функции;
* перегрузка операторов;
* перегрузка имён функций;
* ссылки и операторы управления свободно распределяемой памятью;
* дополнения к стандартной библиотеке.
Результат:
Routine Name Time Time with Children Shared Time Hit Count
IsDigit 2,77621043270976E-7 2,77621043270976E-7 100 1
Routine Name Time Time with Children Shared Time Hit Count
is_member_of 8,54411333532516E-7 1,53142582714098E-6 55,7918848167539 1
Нашёл что сравнивать...
> Наиболее общей и наименее эффективной реализацией
Я же сказал, что is_member_of медленно работать будет. Это функция высшего порядка, которая совершает ещё два вызова по указателю на каждой итерации, какая уж тут скорость. Зато её можно использовать для обхода списков, деревьев, графов, etc. И даже она побьёт по производительности код в топике на достаточно больших строках, потому что у кода в топике квадратичная сложность.
три случая разные, и если в первом от тебя требуется написать именно велосипед, потому что ты учишься, а в третьем тебе приходится писать именно велосипед, потому что жизнь говно и не повезло с профессией, то во втором случае игнорирование хотя бы STL уже ничего хорошего не сулит
> годные программисты не хотят соваться в эту библиотеку
этому есть много объяснений - главное, потому что страшно
потому что они не пишут новое, а дорабатывают старое, а когда всё работает, лучше не трогать
и еще пример из жизни - разговаривал тут с одними, разрабатывают ERP лет десяток-другой, спросил про буст - говорят не рискуют, сами не пробовали, слышали неоднозначные мнения. зато с нетерпением ждут поддержки C++11 их компилятором - на вопрос как так получилось, что немалая часть boost доказала свою востребованность настолько, что её скопипастили в новый стандарт, который вы так ждёте, но вы всё еще кипятите - пожали плечами
буст многогранен, если ты откроешь список, то там дохера отдельных библиотек - не надо разбираться во всех, а в тех, которые ты будешь использовать, буст обычно инлайновый, поэтому в твой код попадет только то, что ты использовал, буст кроссплатформенен, и кому то (мне) это крайне важно в реальных рабочих проектах
ну и факт того, что не приходится на каждый чих писать свой велосипед - это касается не только этого говнокода, но и всех, которые ты постил здесь, оно знаешь ли, не только очень экономит время разработки, но и сильно снижает вероятность создания ошибок, которые тебе потом надо ловить
тогда сложность поиска будет меньше любого strchr