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;

iterend 的类型为

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();

或者使用cbegincend

auto iter = test.cbegin();
auto end = test.cend();

【讨论】:

以上是关于C++:为啥我不能将一对迭代器传递给 regex_search?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 共享指针的行为不像迭代器的标准指针?

(C++) 为啥我不能依靠提取运算符来充当迭代器?

将空范围传递给采用一对迭代器的函数的简洁/简洁的方法是啥?

C++ Primer 5th笔记(chap 17 标准库特殊设施)匹配与 Regex 迭代器类型

为啥我不能将模板函数指针传递给可变参数函数?

OpenGL:为啥我不能将单个浮点数从顶点着色器传递到片段着色器?