Является ли сравнение размеров строк приемлемой альтернативой сравнению символов? - PullRequest
0 голосов
/ 18 мая 2009

Я пишу функцию grep в C ++ (как самостоятельное упражнение - я понимаю, что в нем нет функциональности реальной функции grep), чтобы взять исходную строку и искомую строку поиска. В коде я ввожу все символы в строку grep до первого пробела, который он видит. Затем я сравниваю символы в строке grep со строкой поиска, и, если она совпадает, сохраняю ее во временной строке. Я зацикливаюсь на строке grep и сравниваю длину строки поиска с временной строкой, чтобы увидеть, соответствует ли она.

Мой вопрос: это плохая форма, сравнивая длины? Я мог бы использовать цикл for для сравнения каждого отдельного символа друг с другом, но, похоже, это излишне пожирает циклы процессора. Вот моя функция ввода для справки:

std::string grep(std::string originalStr, std::string searchStr)
{
std::string grepStr = "";
std::string finalStr = "";
//stores final string; is the return value
finalStr.resize(originalStr.length() + 1);
grepStr.resize(originalStr.length() + 1);

int place = 0;
//remember where you are in originalStr[place]
int numOfOccurences = 0;
//remember number of times searchStr was found;
//not necessary
std::string tempStr = "";
//will temporarily hold grepStr    

//handles case if first occurence is a space
if (originalStr[0] == ' ')
{
    place++;
}

while (place != originalStr.length())
{
    tempStr = "";

    while (originalStr[place] != ' ')
    {

        if (originalStr[place] == ' ')
        {
           break;
        }

        grepStr[place] = originalStr[place];
        ++place;
    }

    ++place;//ensures you skip over the space next pass

    for (int i = 0; i != grepStr.length(); i++)
    {
        if (grepStr[i] == searchStr[i])
        {
            //if they are the same, append that char..
            tempStr[i] = grepStr[i];

            if (tempStr.length() == grepStr.length())
            //..then check for string length; if same, searchStr equals tempStr
            //and you can append grepStr to the finalStr
            {                    
                for (int x = 0; x != finalStr.length(); x++)
                {
                    finalStr[x] = grepStr[x];
                }

                ++numOfOccurences;
                //add one to the number of occurences in originalStr
                finalStr += ' ';
                //add a space IF you find the string
            }
        }
    }
}

return finalStr;
}

Ответы [ 2 ]

4 голосов
/ 18 мая 2009

Нет, совсем неплохо. В конце концов, по крайней мере, в некоторых отношениях две строки не могут быть равны, если они не имеют одинаковую длину.

Чтобы действительно хорошо провести время, взгляните на алгоритм сопоставления строк Бойера-Мура и алгоритм Кнута-Пратта-Морриса. J [Так! Он действительно так говорит по буквам] У Мура есть хорошая страница на них.

0 голосов
/ 18 мая 2009

Если вы используете std :: string, функции поиска STL, вероятно, будут работать более эффективно, чем эта версия, которую вы создали. Поиск строки для подстроки - известная проблема, и я уверен, что версия библиотеки максимально оптимизирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...