我正在测试一个小程序,以便创建一个更大的程序。 我有一个3个字符串的向量:
pass
pass
TEST pass pass
我想在向量中搜索子串“pass”,并记录在字符串向量中找到“pass”的次数。
所以基本上我希望它返回数字4(子串“pass”的4个实例)
代码看起来像这样
字符串存储在向量myV1
中if (find(myV1.begin(), myV1.end(), "pass") != myV1.end() )
{
passes++;
}
当我这样做时,它会发现“通过”一次并忽略其他人。
我也无法使用循环。它告诉我,它发现子串的许多实例“通过”的次数与我循环的次数相同。
提前感谢任何建议
答案 0 :(得分:2)
简而言之:here您可以使用在线编译器找到工作代码。
您需要的只是两个循环,一个用于迭代向量元素,另一个循环遍历每个元素,同时计算该特定元素中所需的单词出现次数。外部循环总结了它。
你可以使用string :: find作为内部循环,外部循环是带有迭代器的常规循环。
您需要使用下面的代码段才能正常使用C ++ 98/03和C ++ 11。
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<string> stringList;
stringList.push_back("pass");
stringList.push_back("pass");
stringList.push_back("Test pass pass");
string searchWord = "pass";
int searchWordSize = searchWord.size();
int count = 0;
for (vector<string>::iterator iter = stringList.begin(); iter != stringList.end(); ++iter) {
// Avoid the overlapping search word. If that is needed, replace
// pos+=searchWordSize with ++pos
for (size_t pos = 0; pos < (*iter).length(); pos+=searchWordSize) {
pos = (*iter).find(searchWord, pos);
if (pos != string::npos)
++count;
else
break;
}
}
cout << "Count: " << count << endl;
return 0;
}
我使用以下命令构建并运行代码:
g++ main.cpp
./a.out
预期输出为4
。
答案 1 :(得分:2)
您可以循环向量并使用std::string::find
查找每个字符串中"pass"
的出现位置。
要正确计算子字符串的出现次数,您需要记录第一次出现的postion
然后增加位置并继续搜索。
int count(const std::string& s, const std::string token = "pass")
{
int n(0);
std::string::size_type pos = s.find(token);
while (pos != std::string::npos)
{
pos = s.find(token, pos + 1);
n++;
}
return n;
}
int main()
{
std::vector<std::string> v = {"pass", "pass", "TEST pass pass"};
int total(0);
for (auto& w : v)
{
total += count(w);
}
std::cout << total << std::endl;
}