2009-12-03 4 views
3

문자열에 특정 하위 문자열이 얼마나 많이 있는지를 찾는 표준 방법이나 표준 방법이 있습니까? 예를 들어 문자열의 경우 :문자열에서 여러 번 발생하는 하위 문자열 찾기 [C++]

'How do you do at ou' 

문자열 "ou"가 두 번 나타납니다. 술어를 사용하거나 사용하지 않고 STL 알고리즘을 시도했지만 STL의 알고리즘이 문자열의 구성 요소를 비교하려고합니다.하지만 문자열은 내 경우에는 char이지만 비교할 수는 없습니다. 하위 문자열을 비교하십시오. 나는 이런 식으로 뭔가 함께 올 - 문자열

OBJ -

str을 문자열 우리가

std::string::size_type count_subs(const std::string& str, const std::string& obj) 
{ 
std::string::const_iterator beg = str.begin(); 
std::string::const_iterator end = str.end(); 
std::string::size_type count = 0; 
while ((beg + (obj.size() - 1)) != end) 
{ 
    std::string tmp(beg, beg + obj.size()); 
    if (tmp == obj) 
    { 
     ++count; 
    } 
    ++beg; 
} 
return count; 
} 

찾고 주셔서 감사합니다.

답변

5
#include <string> 
#include <iostream> 

int Count(const std::string & str, 
      const std::string & obj) { 
    int n = 0; 
    std::string ::size_type pos = 0; 
    while((pos = obj.find(str, pos)) 
       != std::string::npos) { 
     n++; 
     pos += str.size(); 
    } 
    return n; 
} 

int main() { 
    std::string s = "How do you do at ou"; 
    int n = Count("ou", s); 
    std::cout << n << std::endl; 
} 
+2

질문 : "oooo"문자열에서 "oo"패턴을 두 번 또는 세 번 계산 하시겠습니까? (Personnaly 나는 그것을 세 번, 따라서 fo + pos pos + = str.size() 대신에 계산할 것입니다. –

+0

그것은 내가 함수를 사용하고 싶었던 의존 할 것입니다. 질문자 자신의 코드에서, 그는 중복되지 않는 사건을 원한다. –

+0

답변 해 주셔서 감사합니다. 논리적 오류가 있다고 생각하지만 str.find (obj, pos) 여야합니다. 어쨌든 기본적으로 STL alg를 사용할 수있는 방법은 없습니다. 명백한 루프를 피하기 위해 count_if 또는 이와 유사한 것을 사용하십시오. 동정. 부스트 팀원들이 그 문제에 대한 어떤 제조법을 가지고 있는지 궁금합니다. –