记录字符串VECTOR中特定子字符串的出现次数

时间:2013-09-07 08:17:24

标签: c++ string vector

我正在测试一个小程序,以便创建一个更大的程序。 我有一个3个字符串的向量:

 pass
 pass
 TEST pass pass

我想在向量中搜索子串“pass”,并记录在字符串向量中找到“pass”的次数。

所以基本上我希望它返回数字4(子串“pass”的4个实例)

代码看起来像这样

字符串存储在向量myV1

if (find(myV1.begin(), myV1.end(), "pass") != myV1.end()  )
{
    passes++;
}

当我这样做时,它会发现“通过”一次并忽略其他人。

我也无法使用循环。它告诉我,它发现子串的许多实例“通过”的次数与我循环的次数相同。

提前感谢任何建议

2 个答案:

答案 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;
}