【将string字符串中的字符转为全部大写或者全部小写】使用中的transform算法。
#include
#include int main() {
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
std::cout << "hello in upper case: " << out << std::endl;
}
但是直接编译上述的代码,编译器会报错。报错信息为:
no matching function for call to ‘transform(
__gnu_cxx::__normal_iterator, std::allocator > >,
__gnu_cxx::__normal_iterator, std::allocator > >,
std::back_insert_iterator, std::allocator > >,
)’
只要把代码中的 std :: toupper改为::toupper就好了,原因在于我们在这里要使用在全局定义的toupper。而不是在命名空间std下定义的toupper。本人的观点是toupper是一个函数,现在编译器搞不清到底要调用哪个命名空间下的toupper函数了。这也是为什么错误信息会提示“unresolved overloaded function type”的原因。
为了帮助编译器解析正确的重载函数,可以对std::toupper做强制类型转换。
(int (*)(int))std::toupper
也就是如下代码:
std::transform(s.begin(), s.end(), std::back_inserter(out),(int (*)(int))std::toupper)
在这里我的理解是命名空间下定义的toupper是一个模板类型的函数。而全局空间的toupper是一个形参为int,返回值也为int的函数。在这里强制转换std::toupper也可以帮助编译器找到正确的重载函数。
注意:
1. 要把string里面的字符全部转换为小写,只需要使用tolower就行了。
2. string里面即便有中文字符,也不影响字符转换。比如把“中国,Hi” 转换为“中国,HI”或者“中国,hi”。
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析