Эффективный memcspn
Кто-нибудь знает об эффективной реализации функции memcspn?? Он должен вести себя как strcspn, но искать диапазон в буфере памяти, а не в строке с нулевым символом в конце. Целевым компилятором является VisualC++ .
Спасибо лука
2 ответа
Решение
Одна почти оптимальная реализация:
size_t memcspan(const unsigned char *buf, size_t len, const unsigned char *set, size_t n)
{
size_t i;
char set2[1<<CHAR_BIT] = {0};
while (n--) set2[set[n]] = 1;
for (i=0; i<len && !set2[buf[i]]; i++);
return i;
}
Может быть лучше использовать битовый массив вместо байтового массива для set2
в зависимости от того, будет ли на вашей машине дороже арифметика или чуть больше кэш-памяти.
Казалось бы, довольно сложно написать неэффективную реализацию этой функции, TBH - реализация кажется довольно простой, поэтому я бы посоветовал написать ее самостоятельно, если вы не можете найти реализацию в разумные сроки.