用下列代码解决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
),而你定义的i
和k
是有符号的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,类型相同了