Пропуск повторяющихся символов в обработке строк c ++ - PullRequest
1 голос
/ 06 мая 2011

Я пишу высокопроизводительную функцию, которая должна обрабатывать строку (char *).

Эти строки часто очень длинные, но содержат повторяющиеся символы, которые не действуют после обработки символа.

Я реализовал std :: set для хранения обработанных символов и проверки того, что этот символ отсутствует в наборе перед обработкой.

Есть ли более эффективный метод, о котором вы можете подумать?

Спасибо

РЕШЕНИЕ:

Я пошел за массивом bool.

bool b[256] = {0};
...
if(!b[*ci]){
  b[*ci]=true;
  ...
} 

Спасибо за помощь!

Ответы [ 3 ]

5 голосов
/ 06 мая 2011

просто массив, равный количеству символов, и отметьте символ в массиве.

3 голосов
/ 06 мая 2011
unsigned char cCheck[256];

void Process(const char* p_cInput)
{
    memset(cCheck, 0, 256);
    while(*p_cInput != '\0')
    {
        if(cCheck[*p_cInput] == 0)
            cCheck[*p_cInput] = 1;
        else
        {
            // We done
            break;
        }

        p_cInput ++;
    }
}
1 голос
/ 06 мая 2011

Вам необходим список из 256 бит (32 байта), который инициализируется 0, а затем вы устанавливаете биты, как видите символ. Самый простой способ создать этот тип данных - разделить его на 4 лота по 8-байтовым целым числам, а затем проверить диапазон символов, чтобы узнать, какой тип int проверять / записывать.

...