C++ transform算法中toupper的使用

C++ transform算法中toupper的使用

前言

用到这样一个函数,将小写字符串转为大写。

// 一开始个人是这样写的,这样没问题
std::transform(res.begin(), res.end(), res.begin(),[](unsigned char c) { return std::toupper(c); });
// 然后,看到这样的写法
std::transform(res.begin(), res.end(), res.begin(),::toupper);
// 哎,::toupper前面怎么没加std,但加上后就会报错,正文为此问题的探究
// No matching function for call to 'transform' candidate template ignored: couldn't infer template argument '_UnaryOperation' candidate function template not viable: requires 5 arguments, but 4 were provided

正文

在C++中,std::toupper 函数有两种版本,分别定义在头文件 <cctype> 中:

  1. 全局函数版本:

    int toupper(int c);
    // 同所有其他来自 <cctype> 的函数,若参数值既不能表示为 unsigned char 又不等于 EOF 则 std::toupper 的行为未定义。为了以简单的 char (或 signed char )安全使用此函数,首先要将参数转换为 unsigned char,这是因为当字符的值是负数时,传参给int会发生符号扩展,使用 unsigned char 类型可以确保在字符转换时不会发生符号扩展,从而得到正确的结果。
    char my_toupper(char ch){return static_cast<char>(std::toupper(static_cast<unsigned char>(ch)));
    }
    // 类似
    std::string str_toupper(std::string s) {std::transform(s.begin(), s.end(), s.begin(), // static_cast<int(*)(int)>(std::toupper)         // 错误// [](int c){ return std::toupper(c); }           // 错误// [](char c){ return std::toupper(c); }          // 错误[](unsigned char c){ return std::toupper(c); } // 正确);return s;
    }
    

    这是最常用的版本,来自标准 C 库函数,且同时位于全局和 std 名字空间,接受一个整数参数 c,返回将小写字母转换为大写字母后的整数值。如果 c 不是小写字母,它将保持不变。

  2. 函数模板版本:

    template< class CharT >
    CharT toupper( CharT ch, const std::locale& loc );
    

    这个版本是函数模板,接受一个字符 ch 和一个 std::locale 对象。它返回将字符 ch 在指定语言环境下转换为大写形式的结果。这个版本通常用于多语言环境下的字符转换。

在这两个版本中,全局函数版本通常用得更广泛,而函数模板版本用于特定的多语言环境需求。在实际编程中,通常使用全局函数版本来进行字符大小写转换。

故当transform 函数(也是一个模板函数)的第四个参数是std::toupper的时候,此时给定的 tolower 只是作为一个函数指针使用,缺乏类型推导所需要的函数参数信息,所以无法推导出函数的类型,也就无法决定使用哪一个重载函数。故解决方法如下:

  • 指明函数类型

    std::transform(res.begin(), res.end(), res.begin(),(int(*)(int))std::toupper);
    
  • 使用包装函数确定函数类型

    int my_toupper( int c ) {
    return toupper( c ); // 根据 c 的类型可以确定使用 toupper 的哪个重载函数。
    }
    // my_toupper 是非模版非重载函数,避免了函数重载带来的类型解析问题。
    transform( s.begin(), s.end(), s.begin(), my_toupper );
    
  • 调用全局下的tolower函数,版本1和2都位于std命名空间下,但版本1还位于全局空间下,故可以直接指定命名空间为全局的那个tolower函数

    std::transform(res.begin(), res.end(), res.begin(),::toupper);
    

故tolower函数也是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游泳耳机入耳式好,还是骨传导好?游泳听音乐最好的耳机推荐

在游泳馆或海边&#xff0c;热爱游泳的人们在水中尽情畅游&#xff0c;享受着清凉的水流和游动的乐趣。为了让游泳体验更上一层楼&#xff0c;戴上专为游泳设计的耳机成为不可或缺的一环。游泳耳机不仅防水&#xff0c;还能让你在畅游的同时&#xff0c;尽情享受高质量的音乐&a…

Android Studio离线开发环境搭建

Android Studio离线开发环境搭建 1.下载离线和解压包2.创建工程3.创建虚拟机tips 1.下载离线和解压包 下载地址 百度网盘&#xff1a;https://pan.baidu.com/s/1XBPESFOB79EMBqOhFTX7eQ?pwdx2ek 天翼网盘&#xff1a;https://cloud.189.cn/web/share?code6BJZf2uUFJ3a&#…

VMware虚拟机部署Linux Ubuntu系统

本文介绍基于VMware Workstation Pro虚拟机软件&#xff0c;配置Linux Ubuntu操作系统环境的方法。 首先&#xff0c;我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是&#xff0c;VMware Workstation Pro软件是一个收费软件&#xff0c;而互联网中有很…

[GYCTF2020]Ezsqli1

打开环境&#xff0c;下面有个提交表单 提交1&#xff0c;2有正确的查询结果&#xff0c;3以后都显示Error Occured When Fetch Result. 题目是sql&#xff0c;应该考察的是sql注入 简单fuzz一下 发现information_schema被过滤了&#xff0c;猜测是盲注了。 测试发现只要有东…

vbs脚本(清空桌面)

VBScript是Visual Basic Script的简称&#xff0c;即 Visual Basic脚本语言&#xff0c;有时也被缩写为VBS。它是一种微软环境下的轻量级的解释型语言&#xff0c;它使用COM组件、WMI、WSH、ADSI访问系统中的元素&#xff0c;对系统进行管理。同时它又是asp动态网页默认的编程语…

OSI七层模型 | TCP/IP模型 | 网络和操作系统的联系 | 网络通信的宏观流程

文章目录 1.OSI七层模型2.TCP/IP五层(或四层)模型3.网络通信的宏观流程3.1.同网段通信3.2.跨网段通信 1.OSI七层模型 在计算机通信诞生之初&#xff0c;不同的厂商都生产自己的设备&#xff0c;都有自己的网络通讯标准&#xff0c;导致了不同厂家之间各种协议不兼容&#xff0…

(大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量

今天&#xff0c;面试了一家公司&#xff0c;什么也不说先来三道面试题做做&#xff0c;第一题。 那么&#xff0c;我们就开始做题吧&#xff0c;谁叫我们是打工人呢。 题目是这样的&#xff1a; 统计除豪车外&#xff0c;销售最差的车 车辆按批销售&#xff0c;每次销售若干…

通俗易懂理解MobileNet网络模型

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 详细且通俗讲解轻量级神经网络——MobileNets【V1、V2、V3】 MobileNet v1 和 MobileNet v2 二、MobileNet v1 原始论文&#xff1a;[1] MobileNet网络详解 【深度学习】轻量化CNN网络MobileNet系列详解 Mo…

RLHF学习

整体流程 三个步骤分解&#xff1a; 预训练一个语言模型 (LM) &#xff1b;聚合问答数据并训练一个奖励模型 (Reward Model&#xff0c;RM) &#xff1b;用强化学习 (RL) 方式微调 LM。 RW RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励&…

springboot2.2.9整合kafka之KafkaListener实现原理

1、开启kafka的注解EnableKafka 通过开启kafka注解可以看到Import的类KafkaListenerConfigurationSelector加载一个配置类KafkaBootstrapConfiguration&#xff0c;而此类中有两个重要的类: KafkaListenerAnnotationBeanPostProcessor、KafkaListenerEndpointRegistry 2、Kaf…

力扣hot100 最小栈 变种栈

Problem: 155. 最小栈 文章目录 思路&#x1f496; Stack 自定义 Node&#x1f37b; Code 思路 &#x1f469;‍&#x1f3eb; 甜姨 &#x1f496; Stack 自定义 Node 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( n ) O(n) O(n) &#x1f37b; Code class MinS…

轻松打卡:使用Spring Boot和Redis Bitmap构建高效签到系统【redis实战 四】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 轻松打卡&#xff1a;使用Spring Boot和Redis Bitmap构建高效签到系统【redis实战 四】 引言(redis实战)前言回顾bitmap基本概念核心特性使用场景 为什么使用redis中的bitmap实现&#xff1f;1. 存储效…

紫光展锐M6780丨超分辨率技术——画质重构还原经典

上一期&#xff0c;我们揭秘了让画质更加炫彩的AI-PQ技术。面对分辨率较低的老电影&#xff0c;光有高饱和度的色彩是不够的&#xff0c;如何能够提高视频影像的分辨率&#xff0c;使画质更加清晰&#xff0c;实现老片新看&#xff1f; 本期带大家揭晓紫光展锐首颗AI8K超高清智…

【分布式技术专题】「分布式技术架构」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)

探索Tomcat技术架构设计模式的奥秘 Tomcat系统架构分析Tomcat 整体结构Tomcat总体结构图以 Service 作为“婚姻”1) Service 接口方法列表 2) StandardService 的类结构图方法列表 3) StandardService. SetContainer4) StandardService. addConnector 以 Server 为“居”1) Ser…

etcd技术解析:构建高可用分布式系统的利器

1. 引言 随着云原生技术的兴起&#xff0c;分布式系统的构建变得愈发重要。etcd作为一个高可用的分布式键值存储系统&#xff0c;在这个领域发挥着至关重要的作用。本文将深入探讨etcd的技术细节&#xff0c;以及如何利用它构建高可用的分布式系统。 2. etcd简介 etcd是一个开…

通过Builder来构建集合list和map

之前已经写过一篇通用Builder来构建实例对象的&#xff08;基于Java8的新特性写一个通用的Builder工具类_java手动写一个builder-CSDN博客&#xff09;但是这个builder不能构建集合&#xff0c;也就是list和map&#xff0c;今天突然心血来潮&#xff0c;想写写集合类的builder&…

JVM系列-9.性能调优

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

大数据安全 | 期末复习(中)

文章目录 &#x1f4da;感知数据安全⭐️&#x1f407;传感器概述&#x1f407;传感器的静态特性&#x1f407;调制方式&#x1f407;换能攻击&#x1f407;现有防护策略 &#x1f4da;AI安全⭐️&#x1f407;智能语音系统——脆弱性&#x1f407;攻击手段&#x1f407;AI的两…

探索IOC和DI:解密Spring框架中的依赖注入魔法

IOC与DI的详细解析 IOC详解1 bean的声明2 组件扫描 DI详解 IOC详解 1 bean的声明 IOC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。 要把某个对象交给IOC容器管理&#xff0c;需要在类上…

【深度学习】sdxl中的 text_encoder text_encoder_2 区别

镜像问题是&#xff1a;https://editor.csdn.net/md/?articleId135867689 代码仓库&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图&#xff1a; 为什么有两个CLIP编码器 text_encoder 和 text_encoder_2 &#xff1f; 在…