- 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;
}
sanchousf 18.01.2012 23:25 # 0
ctm 19.01.2012 08:03 # +4
стоп. а как соотносится название isDigit с проверкой наличия символа в строке
TarasB 19.01.2012 09:20 # 0
ctm 19.01.2012 10:26 # 0
roman-kashitsyn 19.01.2012 10:42 # 0
defecate-plusplus 19.01.2012 10:48 # 0
думаю, в зависимости от содержимого в cKeys подошло бы (ckey >= '0' && ckey <= '9') в лучшем случае и binary_search в худшем
bugmenot 19.01.2012 11:01 # 0
absolut 19.01.2012 21:28 # 0
bugmenot 19.01.2012 21:51 # 0
absolut 19.01.2012 22:51 # 0
bugmenot 20.01.2012 07:59 # 0
absolut 20.01.2012 09:50 # 0
char - символ,
unsigned/signed char - байт.
defecate-plusplus 20.01.2012 10:16 # 0
absolut 20.01.2012 11:05 # 0
bugmenot 20.01.2012 12:11 # 0
absolut 20.01.2012 14:11 # +1
FB
bugmenot 20.01.2012 14:29 # 0
roman-kashitsyn 19.01.2012 11:04 # 0
defecate-plusplus 19.01.2012 11:22 # 0
> в зависимости от содержимого в cKeys
> в зависимости от содержимого в cKeys
только афтар знает что там
может сканкоды клавиш устройства
например 0x90, 0x93, 0x96, 0xA0, 0xA3, 0xA6 и т.д.
я всё это выше учел
roman-kashitsyn 19.01.2012 11:23 # −1
маладец
а я не маладец
Говногость 19.01.2012 11:28 # −1
А в помойку его.
std::unordered_map
roman-kashitsyn 19.01.2012 12:40 # +2
Говногость 19.01.2012 13:16 # −1
TarasB 19.01.2012 13:23 # +1
Говногость 19.01.2012 15:28 # −1
defecate-plusplus 19.01.2012 15:45 # +2
если бы ты намекнул о простом трюке - берем таблицу из 255 элементов bool и записываем в нее true туда, где элементы - "цифры", т.о. сводим определение "цифра"/"не цифра" к if (digits_table[passed_char]) - это бы еще имело право на жизнь
но не unordered_set, извини
Говногость 19.01.2012 15:48 # 0
Убрать до естественного вычисления хеша, данные подходящие.
>а уж по памяти явно проиграет непрерывному массиву из ~10 значений
Согласен.
>если бы ты намекнул о простом трюке - берем таблицу из 255 элементов bool
vector<bool>? Имеет право на жизнь. Компактно относительно.
TarasB 19.01.2012 16:13 # 0
Говногость 19.01.2012 17:27 # 0
roman-kashitsyn 19.01.2012 17:34 # +2
TarasB 19.01.2012 15:46 # 0
roman-kashitsyn 19.01.2012 11:21 # 0
eth0 19.01.2012 12:37 # 0
roman-kashitsyn 19.01.2012 12:39 # −1
roman-kashitsyn 19.01.2012 10:12 # +5
defecate-plusplus 19.01.2012 10:41 # +6
отдельный вид программистов - крестодельфины - развиваются в изолированной экосистеме, и вмешательство STL в их скромную цивилизацию может привести к трагедии
поэтому ученые сегодня стараются только наблюдать, на будущее разрабатывая методики психокоррекции для возможной ассимиляции этого подвида среди обычных людей
TarasB 19.01.2012 11:22 # 0
Это что за мутант?
defecate-plusplus 19.01.2012 11:25 # +5
absolut 19.01.2012 21:32 # +1
Govnocoder#0xFF 19.01.2012 20:01 # +1
Мне почему-то представился дельфин (млекопитающие) с большим крестом на брюхе. Я один такой?
bugmenot 19.01.2012 20:31 # 0
istem 19.01.2012 20:32 # 0
absolut 19.01.2012 21:33 # 0
TarasB 19.01.2012 23:34 # +5
SmackMyBitchUp 20.01.2012 08:12 # 0
eth0 20.01.2012 12:29 # +1
gegMOPO4 31.01.2012 00:33 # +1
Говногость 19.01.2012 11:31 # −1
Говнецо то ещё...
Steex 19.01.2012 14:15 # 0
писать что-то вроде:
roman-kashitsyn 19.01.2012 14:40 # 0
defecate-plusplus 19.01.2012 14:40 # 0
делать такой метод в std::list - глупо, если программист так сильно хочет найти элемент в нем, значит его ничто не остановит сделать это в виде линейного std::find
Steex 19.01.2012 14:48 # 0
defecate-plusplus 19.01.2012 15:01 # −3
Depriver 19.01.2012 15:48 # 0
rat4 20.01.2012 08:09 # 0
Depriver 20.01.2012 08:51 # −1
Govnocoder#0xFF 19.01.2012 19:59 # 0
FalseCoder 20.01.2012 02:18 # −12
ctm 20.01.2012 08:07 # −1
ГК именно за это.
FalseCoder 20.01.2012 10:50 # −1
roman-kashitsyn 20.01.2012 10:53 # +2
для ANSI C c учётом strlen может быть, и то там можно лучше написать. А в плюсах это вообще унылый не особо реюзабельный велосипед.
FalseCoder 20.01.2012 13:00 # 0
roman-kashitsyn 20.01.2012 13:51 # 0
Пример использования со строками:
http://codepad.org/WqTdlt2N
Разумеется, такая реализация имеет ряд ограничений и может пригодится разве что внутри какой-нибудь библиотеки для работы с множеством различных структур-последовательностей. Алгоритм линейного поиска в массиве известного типа вы и сами можете написать. Хотя я бы использовал бинарный поиск и таблицы везде где это возможно.
defecate-plusplus 20.01.2012 13:59 # +1
а то насоветуешь щяс ему
roman-kashitsyn 20.01.2012 14:00 # 0
defecate-plusplus 20.01.2012 14:08 # 0
над тарасом, реализовав рантайм-метапрограммирование даже в сишке с её сишкопроблемами
TarasB 20.01.2012 17:43 # 0
Говногость 20.01.2012 19:42 # 0
TarasB 20.01.2012 20:25 # 0
defecate-plusplus 20.01.2012 09:28 # +6
написал велосипед, где 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
FalseCoder 20.01.2012 10:59 # −4
Для int как и было уже сказано есть int isdigit(int c)
Универсальность определялось той динамичностью, при которой добавив в массив cKeys ещё любые символы, можно было использовать ф-ю для разного вида ограничений ввода символов.
Ну, если конечно массив небольшой, то этот вариант вполне подойдёт.
Govnocoder#0xFF 20.01.2012 17:27 # 0
FalseCoder 20.01.2012 13:06 # −2
Говногость 20.01.2012 13:24 # 0
Это модно.
bugmenot 20.01.2012 13:24 # 0
roman-kashitsyn 20.01.2012 13:25 # +2
I LOL'D
FalseCoder 20.01.2012 13:46 # −1
Нововведениями Си++ в сравнении с Си являются:
* поддержка объектно-ориентированного программирования;
* поддержка обобщённого программирования через шаблоны;
* дополнительные типы данных;
* исключения;
* пространства имён;
* встраиваемые функции;
* перегрузка операторов;
* перегрузка имён функций;
* ссылки и операторы управления свободно распределяемой памятью;
* дополнения к стандартной библиотеке.
SmackMyBitchUp 20.01.2012 13:33 # −1
TarasB 20.01.2012 13:40 # +2
defecate-plusplus 20.01.2012 13:44 # +2
FalseCoder 21.01.2012 01:10 # −5
Результат:
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
roman-kashitsyn 21.01.2012 09:12 # 0
Нашёл что сравнивать...
> Наиболее общей и наименее эффективной реализацией
Я же сказал, что is_member_of медленно работать будет. Это функция высшего порядка, которая совершает ещё два вызова по указателю на каждой итерации, какая уж тут скорость. Зато её можно использовать для обхода списков, деревьев, графов, etc. И даже она побьёт по производительности код в топике на достаточно больших строках, потому что у кода в топике квадратичная сложность.
bugmenot 21.01.2012 10:52 # −1
FalseCoder 21.01.2012 11:42 # −4
defecate-plusplus 21.01.2012 12:22 # +3
три случая разные, и если в первом от тебя требуется написать именно велосипед, потому что ты учишься, а в третьем тебе приходится писать именно велосипед, потому что жизнь говно и не повезло с профессией, то во втором случае игнорирование хотя бы STL уже ничего хорошего не сулит
> годные программисты не хотят соваться в эту библиотеку
этому есть много объяснений - главное, потому что страшно
потому что они не пишут новое, а дорабатывают старое, а когда всё работает, лучше не трогать
и еще пример из жизни - разговаривал тут с одними, разрабатывают ERP лет десяток-другой, спросил про буст - говорят не рискуют, сами не пробовали, слышали неоднозначные мнения. зато с нетерпением ждут поддержки C++11 их компилятором - на вопрос как так получилось, что немалая часть boost доказала свою востребованность настолько, что её скопипастили в новый стандарт, который вы так ждёте, но вы всё еще кипятите - пожали плечами
буст многогранен, если ты откроешь список, то там дохера отдельных библиотек - не надо разбираться во всех, а в тех, которые ты будешь использовать, буст обычно инлайновый, поэтому в твой код попадет только то, что ты использовал, буст кроссплатформенен, и кому то (мне) это крайне важно в реальных рабочих проектах
ну и факт того, что не приходится на каждый чих писать свой велосипед - это касается не только этого говнокода, но и всех, которые ты постил здесь, оно знаешь ли, не только очень экономит время разработки, но и сильно снижает вероятность создания ошибок, которые тебе потом надо ловить
FalseCoder 21.01.2012 12:36 # 0
defecate-plusplus 21.01.2012 12:52 # +4
тогда сложность поиска будет меньше любого strchr
guest 15.09.2012 13:24 # 0
guest 15.09.2012 13:25 # 0