使用std :: search查找多次出现的模式

时间:2014-04-14 13:49:15

标签: c++ search

我想使用函数搜索或其他类似函数来查找给定模式的多次出现。

这是我的代码:

#include <cstring>  
#include <iostream> 
#include <iomanip>  
#include <set>
#include <list>
#include <vector>
#include <map>   
#include <algorithm>
#include <functional>
using namespace std;

int main () {
  std::vector<int> haystack;

  string a = "abcabcabc";
  string b = "abc";
  string::iterator it;
  it = search(a.begin(),a.end(),b.begin(),b.end());

  if(it!=a.end()){
      cout << it-a.begin()<<endl;
  }

  return 0;
}

此代码返回0作为第一次出现的模式“abc”,想要返回0,3,6。这将是原始字符串中模式开始的所有索引。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

for(size_t pos=a.find(b,0); pos!=std::string::npos; pos=a.find(b,pos+1)) {
    std::cout << pos << std::endl;
}    

这直接使用std::basic_string::findref)来查找子字符串的起始位置。

答案 1 :(得分:1)

search函数在第一个字符串a中搜索第二个字符串b的元素是否出现。由于您的第二个字符串包含元素abc,代码会将迭代器返回到第一个位置,然后返回第二个,第三个,...

您使用的是find功能。它返回一个迭代器,该迭代器等于你正在搜索的元素。在您的情况下,您在字符串a中搜索元素abc。所以你必须打电话

string::iterator it = std::find(a.begin(), a.end(), "abc");
while (it != a.end()) {
    // Do whatever you want to do...
    ++it;
    it = std::find(it, a.end(), "abc");
}

答案 2 :(得分:0)

ProjectSingle