报错说没有匹配的min(),但是把参数单独定义一下又没问题了,这是为什么?

用下列代码解决541. 反转字符串 II

string reverseStr(string s, int k) {
    for(int i=0;i<s.size();i+=2*k){
        reverse(s.begin()+i,s.begin()+min(i+k,s.size()));
    }
    return s;
}

报错说找不到min()方法:

Line 5: Char 43: error: no matching function for call to 'min'
            reverse(s.begin()+i,s.begin()+min(i+k,s.size()));
                                          ^~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/algorithmfwd.h:383:5: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('int' vs. 'unsigned long')
    min(const _Tp&, const _Tp&);
    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_algo.h:3450:5: note: candidate template ignored: could not match 'initializer_list<type-parameter-0-0>' against 'int'
    min(initializer_list<_Tp> __l, _Compare __comp)
    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_algo.h:3444:5: note: candidate function template not viable: requires single argument '__l', but 2 arguments were provided
    min(initializer_list<_Tp> __l)
    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/algorithmfwd.h:388:5: note: candidate function template not viable: requires 3 arguments, but 2 were provided
    min(const _Tp&, const _Tp&, _Compare);
    ^
1 error generated.

但是把s.size()单独dia出来定义一个参数就好了。

string reverseStr(string s, int k) {
    int n=s.size();
    for(int i=0;i<s.size();i+=2*k){
        reverse(s.begin()+i,s.begin()+min(i+k,n));
    }
    return s;
}

这是为什么?

min比较的类型要一致
min(i+k,s.size())) --> i +k 为int, s.size()为unsigned long
改成下面这种
min(i+k,n) -->类型匹配了,就没问题

类型不一样,没法比较

std::min()时一个模板函数(定义如下),可以看出它的两个参数类型是必须是一样的。
s.size()返回的是无符号整型(所有的STL容器类的size()函数返回的都是无符号整型,一般是std::size_t),而你定义的ik是有符号的int类型,因此在解析函数调用时就无法匹配到min(int, std::size_t)这样类型的函数。
解决方法就是把传入的参数类型统一一下,比如把i的类型改为std::size_t,或把s.size()返回值强制转换为int

 /**
   *  @brief This does what you think it does.
   *  @ingroup sorting_algorithms
   *  @param  __a  A thing of arbitrary type.
   *  @param  __b  Another thing of arbitrary type.
   *  @return   The lesser of the parameters.
   *
   *  This is the simple classic generic implementation.  It will work on
   *  temporary expressions, since they are only evaluated once, unlike a
   *  preprocessor macro.
  */
  template<typename _Tp>
    _GLIBCXX14_CONSTEXPR
    inline const _Tp&
    min(const _Tp& __a, const _Tp& __b)
    {
      // concept requirements
      __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
      //return __b < __a ? __b : __a;
      if (__b < __a)
    return __b;
      return __a;
    }

没有定义min(int, std::size_t),size_t是无符号整型,所以函数参数不匹配,只有min(int,int);参数应传入int

size()返回的结果为unsigned int类型,i+k为int类型,两者类型不统一不能做比较;将s.size单独定义为int,类型相同了

img