2013-08-29 3 views
2

나는 문자열의 벡터를 가지고 있으며, 벡터의 모든 'Ace'를 계산하려고합니다. 이것은 단지 "Ace", "Ace"의 발생하지 총 수의를 포함하는 문자열의 수를 계산하는 것이벡터에서 문자열의 문자/문자열 찾기 C++

auto cnt = count_if(begin(vec), 
        end(vec), 
        [&](const string& str) { 
         return str.find(value) != std::string::npos; 
        }); 

참고 : 지금은 단 하나 ...

int main() 
{ 
    std::vector<string> vec; 
    vec.push_back("Ace of Spades"); 
    vec.push_back("Ace"); 
    string value = "Ace"; 
    int cnt = 0; 
    auto iter = find_if(begin(vec), end(vec), [&](const string &str) 
    { 
     return str.find(value) != str.npos; 
    }); 
    if(iter == end(vec)) 
     cout << "no found" << endl; 
    else 
    { 
     cout << *iter << endl; 
     cnt++; 
     cout << cnt++ << endl; 
    } 
} 
+0

그럼 당신하지 * 반복 처리 * 반환 된 반복자를 사용하여, 당신은 첫 번째 것을 인쇄합니다. –

답변

9

당신은 std::count_if를 사용할 수 있습니다 찾을 수 있습니다 벡터의 요소.

+0

대소 문자를 구분합니다. –

1

카운트에 일치하는 요소의 개수를 지정하려는 경우 std::count_if을 사용할 수 있습니다. 당신은 또한 그들과 함께 뭔가를 할 필요가 있다면, 그것은 아마 표준 라이브러리 알고리즘에 대해 잊고과 같이위한 원거리 사용하는 것이 가장 좋은 것입니다 :

int count = 0; 
for (const auto& element : vec) { 
    if (element.find(value) != std::string::npos) { 
     std::cout << element << std::endl; 
     ++count; 
    } 
} 
std::cout << count << std::endl; 
+0

'for_each'와 펑터를 사용할 수있을 때 왜 [stl] 알고리즘을 잊어 버리고 싶습니까? –

+0

@ZacHowland 물론 for_each를 사용할 수 있지만 원거리 for 루프는 훨씬 더 명확하고 읽기 쉽습니다. 알고리즘은 훌륭한 도구이지만 사용하기 위해 * 사용할 필요는 없습니다. –

+0

동의합니다. C++ 11에서는 이전보다 훨씬 자주 for_each를 사용합니다. – juanchopanza