1

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

 pass
 pass
 TEST pass pass

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

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

代码看起来像这样

字符串存储在向量 myV1

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

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

我也无法让循环工作。它告诉我,它发现子字符串“pass”的许多实例与我循环的次数一样多。

提前感谢您的任何建议

4

2 回答 2

2

简而言之:在这里您可以找到带有在线编译器的工作代码。

您所需要的只是两个循环,一个用于迭代向量元素,另一个用于迭代每个元素,同时计算该特定元素中所需单词的出现次数。然后外部循环对其进行总结。

您可以将 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如预期的那样。

于 2013-09-07T08:29:23.457 回答
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;
}
于 2013-09-07T08:30:12.010 回答