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

后端 未结 2 634
醉话见心
醉话见心 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<string::const_iterator> 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<BidirIt,Alloc>& m,
                       const std::basic_regex<CharT,Traits>& 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<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

    0 讨论(0)
  • 2021-01-26 23:05

    regex_search expects a const_iterator but you are passing a std::string::iterator.


    Make your string const

    const string test("abc");
    

    Declare a const_iterator

    std::string::const_iterator iter = test.begin();
    std::string::const_iterator end = test.end();
    

    Or use cbegin and cend

    auto iter = test.cbegin();
    auto end = test.cend();
    
    0 讨论(0)
提交回复
热议问题