C++: Why I can't pass a pair of iterators to regex_search?

后端 未结 2 635
醉话见心
醉话见心 2021-01-26 22:46

I try to pass a pair of iterators to represent a string sequence:

    #include
    #include
    using namespace std;
    int main(int          


        
2条回答
  •  粉色の甜心
    2021-01-26 23:04

    The issue you are having here is a type mismatch between the iterators you are passing to regex_search and the iterator defined for smatch. std::smatch is defined as:

    typedef match_results smatch;
    

    and iter and end have the type of

    string::iterator
    

    When you call regex_search the iterator version is defined as

    template< class BidirIt, 
            class Alloc, class CharT, class Traits >  
    bool regex_search( BidirIt first, BidirIt last,
                       std::match_results& m,
                       const std::basic_regex& e,
                       std::regex_constants::match_flag_type flags = 
                           std::regex_constants::match_default );
    

    And as we can see the iterators and the iterators of the match_result have to match. If we change

    auto iter = test.begin();
    auto end = test.end();
    

    To

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

    Then everything now has the type of string::const_iterator and it will compile

    #include
    #include
    #include 
    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

提交回复
热议问题