2009-05-18 1 views
0

저는 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; 
} 

답변

4

아니, 전혀 나쁜 형태가 아닙니다. 결국, 어떤 의미에서는 두 개의 문자열이 같은 길이가 아닌 경우 두 개의 문자열이 같을 수 없습니다.

Boyer-Moore 문자열 일치 알고리즘과 Knuth-Pratt-Morris 알고리즘을 살펴보십시오. J [sic! 그는 정말로 그렇게 말합니다. Moore는 nice page을 가지고 있습니다.

+0

Boyer-Moore 빠른 문자열 검색 알고리즘에 대한 링크가 매우 흥미 롭습니다. 감사합니다. –

+0

당신이 좋아하는 것을 기쁘게 생각합니다. 정말 멋진 알고리즘입니다. 정말 꽤 직관력이 없어서 당신은 그 문자열을 빠르게 일치시킬 수 있습니다. –

0

std :: string을 사용하는 경우 STL 찾기 기능이 사용자가 만든이 버전보다 더 효율적으로 실행됩니다. 문자열을 부분 문자열로 검색하는 것은 알려진 문제이며 라이브러리 버전이 최대한 최적화되어 있다고 확신합니다.

+2

너 재미 없어. ;-) –

+0

재미 있지 않습니까? 이봐 요, 자기 개혁을 위해 바퀴를 재발견하고 싶다면, 나는 그를 멈추게하지 않을 것입니다. 그러나 그가 일하는 곳에서 일하게된다면 그의 "Wheel 2.0.0α"를 유지하고 싶지는 않습니다. 재미 없어. – jmucchiello

+0

죄송합니다. 지금 C++로 프로그래밍하는 법을 배우고 있습니다. 나는 find 함수에 익숙하지 않지만 앞으로 find 함수를 사용하려고 시도 할 것이다. – jkeys