2013-08-29 137 views
2

我有一個字符串向量,並且我想要計算向量中的所有'Ace'。現在,我只能找到一個...從向量C++中找到字符串中的字符串/字符串

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

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

注意,這隻能算作字符串包含"Ace",在"Ace"出現的不總數的數矢量的元素。

+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