C++:为啥我不能将一对迭代器传递给 regex_search?
Posted
技术标签:
【中文标题】C++:为啥我不能将一对迭代器传递给 regex_search?【英文标题】:C++: Why I can't pass a pair of iterators to regex_search?C++:为什么我不能将一对迭代器传递给 regex_search? 【发布时间】:2015-10-23 16:40:17 【问题描述】:我尝试传递一对迭代器来表示一个字符串序列:
#include<regex>
#include<string>
using namespace std;
int main(int argc,char *argv[])
smatch results;
string temp("abc");
string test("abc");
regex r(temp);
auto iter = test.begin();
auto end = test.end();
if(regex_search(iter,end,results,r))
cout<<results.str()<<endl;
return 0;
错误是这样的:
错误:没有匹配函数调用‘regex_search(__gnu_cxx::__normal_iterator >&, __gnu_cxx::__normal_iterator >&, std::smatch&, std::regex&)' if(regex_search(iter,end,results,r))
【问题讨论】:
尝试将 iter 和 end 的值从 test.begin() 和 test.end() 更改为test.cbegin()
和 test.cend()
【参考方案1】:
您在这里遇到的问题是您传递给regex_search
的迭代器与为smatch
定义的迭代器之间的类型不匹配。 std::smatch
定义为:
typedef match_results<string::const_iterator> smatch;
而iter
和end
的类型为
string::iterator
当您调用regex_search
时,迭代器版本定义为
template< class BidirIt, class Alloc, class CharT, class Traits > bool regex_search( BidirIt first, BidirIt last, std::match_results<BidirIt,Alloc>& m, const std::basic_regex<CharT,Traits>& e, std::regex_constants::match_flag_type flags = std::regex_constants::match_default );
我们可以看到迭代器和match_result
的迭代器必须匹配。如果我们改变
auto iter = test.begin();
auto end = test.end();
到
auto iter = test.cbegin();
auto end = test.cend();
那么现在所有东西的类型都是string::const_iterator
,它会编译
#include<regex>
#include<string>
#include <iostream>
using namespace std;
int main()
smatch results;
string temp("abc");
string test("abc");
regex r(temp);
auto iter = test.cbegin();
auto end = test.cend();
if (regex_search(iter, end, results, r))
cout << results.str() << endl;
return 0;
Live Example
【讨论】:
【参考方案2】:regex_search
需要 const_iterator
,但您传递的是 std::string::iterator
。
让你的字符串const
const string test("abc");
声明const_iterator
std::string::const_iterator iter = test.begin();
std::string::const_iterator end = test.end();
或者使用cbegin
和cend
auto iter = test.cbegin();
auto end = test.cend();
【讨论】:
以上是关于C++:为啥我不能将一对迭代器传递给 regex_search?的主要内容,如果未能解决你的问题,请参考以下文章