比较字符串大小是比较字符的可接受替代方法吗?

时间:2009-05-18 01:00:49

标签: string grep

我正在用C ++编写一个grep函数(作为一个自我指定的练习 - 我意识到它没有实际grep功能的功能)来获取原始字符串和你正在寻找的搜索字符串。在代码中,我输入一个grep字符串中的所有字符,直到它看到的第一个空格。然后我将grep字符串中的字符与搜索字符串进行比较,如果匹配,则将其存储在临时字符串中。我循环遍历grep字符串,并将搜索字符串的长度与临时字符串进行比较,以查看它是否匹配。

我的问题:那是不好的形式,比较长度?我可以使用for循环来比较每个单独的字符,但这似乎会不必要地占用CPU周期。这是我的输入函数供参考:

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 个答案:

答案 0 :(得分:4)

不,不是坏形式。毕竟,至少在某些意义上,如果它们的长度不相等,则两个字符串不能相等。

在非常愉快的时候,看看Boyer-Moore字符串匹配算法和Knuth-Pratt-Morris算法。 J [原文如此!他真的这么说吧!摩尔对他们有一个nice page

答案 1 :(得分:0)

如果您正在使用std :: string,则STL查找函数可能比您创建的版本更有效地运行。在字符串中搜索子字符串是一个已知问题,我确信库版本已尽可能优化。