Пропуск дубликатов символов при обработке строк на c

#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 проверять / записывать.