#c #string #set #character
#c #строка #установить #символ
Вопрос:
Я пишу высокопроизводительную функцию, которой необходимо обработать строку (char *).
Эти строки часто очень длинные, но содержат повторяющиеся символы, которые не оказывают никакого эффекта после обработки символа.
Я реализовал std::set для хранения обработанных символов и проверки отсутствия символа в наборе перед обработкой.
Есть ли более эффективный метод, который вы можете придумать?
Спасибо
РЕШЕНИЕ:
Я выбрал массив bool.
bool b[256] = {0};
...
if(!b[*ci]){
b[*ci]=true;
...
}
Спасибо за помощь!
Ответ №1:
просто массив, длина которого равна количеству символов, и отметьте галочкой символ внутри массива.
Комментарии:
1. я думаю, что это theta (1), а подход hipyhop — theta (lg (n))
Ответ №2:
unsigned char cCheck[256];
void Process(const char* p_cInput)
{
memset(cCheck, 0, 256);
while(*p_cInput != '')
{
if(cCheck[*p_cInput] == 0)
cCheck[*p_cInput] = 1;
else
{
// We done
break;
}
p_cInput ;
}
}
Ответ №3:
Вам нужен 256-битный (32 байта) список, который инициализируется значением 0, а затем вы устанавливаете биты по мере того, как видите символ. Самый простой способ создать этот тип данных — разделить его на 4 части по 8 байтовых целых чисел, а затем вы можете проверить диапазон символа, чтобы увидеть, в какой int проверять / записывать.