【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 )

这篇具有很好参考价值的文章主要介绍了【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。





一、二元谓词使用场景 - 大小写不敏感 set 集合



1、需求分析


本篇博客中 , 实现一个 set 集合 , 存放 英文字母 组成的字符串 , 且 大小写不敏感 ;

实现的方法 : 自定义字符串 对比排序规则 , 先 将 字符串 都转为小写字母 , 然后进行对比 ;


2、tolower 函数 - 将字符转为小写字母


tolower 函数是 C / C++ 标准库 中的函数 , 其作用是 将 字符从 大写形式 转换为 小写形式 , 该函数定义在 C++ 头文件 的 <cctype> 中 或 C 语言头文件的 <ctype.h> 中 ;

  • 如果传入的 字符 是 大写字母 , 将 该大写字母 转为小写字母 并返回 ;
  • 如果传入的 字符 是 小写字母 , 将 该小写字母 直接返回 ;

tolower 函数原型如下 :

int tolower(int c);
  • 参数解析 : 参数 c 表示字符的 int 类型的值 ;
    • char -> int 类型转换 : 参数中使用了 int 类型值 , 一般情况下此处应该传入一个 char 类型的值 , 该 字符 会被隐式地转换为 int 类型 ;
    • 传入的值需要 在 [ CHAR_MIN , CHAR_MAX ] 区间 中 , 或者 是 EOF ( -1 ) 值 ;
  • 返回值解析 : 如果 参数 c 是 大写字母 , 则返回对应的小写字母 ; 否则 , 返回 c 字符本身 ; 返回值是 int 类型的 , 但通常可以安全地将其转换回 char 类型 ;

注意 : 为了保证 tolower 函数的行为 的 稳定性 , 建议 先将 char 类型的参数转换为 unsigned char , 然后 再传递给 tolower 函数 ; 运行该程序的平台可能是 Windows / Linux , Arm / 单片机 平台 , 如果 char 在指定的平台上 被当作负数处理 , 直接传递给 tolower 可能会导致未定义的行为 ;


代码示例 :

#include "iostream"
using namespace std;
#include <algorithm> 

int main() {

	string hello = "Hello, World!";

	// 将字符串中的所有字符元素转为小写字母
	transform(hello.begin(), hello.end(), hello.begin(), tolower);

	cout << hello << endl;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

hello, world!
Press any key to continue . . .

【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 ),c++,算法,开发语言,STL,tolower,transform,toupper


3、toupper 函数 - 将字符转为大写字母


与 tolower 函数对象 相对的是 toupper 函数 , 可以将 字符 转为 大写形式 ;

toupper 函数原型如下 :

int toupper(int c);
  • 参数解析 : 参数 c 表示字符的 int 类型的值 ;
    • char -> int 类型转换 : 参数中使用了 int 类型值 , 一般情况下此处应该传入一个 char 类型的值 , 该 字符 会被隐式地转换为 int 类型 ;
    • 传入的值需要在 [ CHAR_MIN , CHAR_MAX ] 区间 中 , 或者是 EOF ( -1 ) 值 ;
  • 返回值解析 : 如果参数 c 是 小写字母 , 则返回对应的大写字母 ; 否则 , 返回 c 字符本身 ; 返回值是 int 类型的 , 但通常可以安全地将其转换回 char 类型 ;

代码示例 :

#include "iostream"
using namespace std;
#include <algorithm> 

int main() {

	string hello = "Hello, World!";

	// 将字符串中的所有字符元素转为大写字母
	transform(hello.begin(), hello.end(), hello.begin(), toupper);

	cout << hello << endl;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

HELLO, WORLD!
Press any key to continue . . .

【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 ),c++,算法,开发语言,STL,tolower,transform,toupper


4、基于 tolower 实现大小写不敏感的比较函数对象


该 set 集合 的 比较函数 的 函数对象 , 是一个二元谓词 ,

重写的 函数调用操作符 函数如下 :

bool operator()(const string& str1, const string& str2)

接收 2 个 字符串 参数 ,

注意 : 比较的前提是 不能修改实参的值 , 这里重新创建 2 个字符串 , 用于 将 字符串转为 小节字母 并 进行比较 ;


首先 , 创建一个新的 字符串 对象 ;

		// 创建字符串
		string s1;

然后 , 根据 传入的 字符串参数大小 , 设置 新创建的字符串对象 ;

		// 重新设置字符串大小
		s1.resize(str1.size());

最后 , 调用 transform 算法 , 将 字符串 中的字符元素 , 都转为小写字母 ;

		// 将字符串的所有元素都转换为小写元素
		transform(str1.begin(), str1.end(), s1.begin(), tolower); 

得到 全是 小写字母 的字符串 后 , 使用该 小写字母 字符串 与 另外一个参数 转成的 小写字母 字符串 进行对比 , 这样就实现了 大小写不敏感的 set 集合 ;


代码示例如下 :

#include <algorithm>
#include "functional"

/// <summary>
/// 二元谓词 大小写不敏感比较
/// </summary>
class Compare
{
public:
	bool operator()(const string& str1, const string& str2) const
	{
		// 比较的前提是不能修改实参的值
		// 这里重新创建 2 个字符串 , 用于进行比较

		// 创建字符串
		string s1;
		// 重新设置字符串大小
		s1.resize(str1.size());
		// 将字符串的所有元素都转换为小写元素
		transform(str1.begin(), str1.end(), s1.begin(), tolower); //预定义函数对象 

		string s2;
		s2.resize(str2.size());
		transform(str2.begin(), str2.end(), s2.begin(), tolower); //预定义函数对象 

		// 从小到大进行排序
		return (s1 < s2);
	}
};




二、代码示例 - 二元谓词使用场景



1、普通的 set 集合查找元素 - 大小写匹配查找成功


创建普通的 set 集合 , 并插入三个元素 ;

	// 创建一个 set 集合容器
	set<string> mySet;

	// 向容器中插入元素
	mySet.insert("b");
	mySet.insert("a");
	mySet.insert("c");

集合中的元素是

a b c

在集合中查找 字符串 " a " , 肯定能找到该元素 ;

代码示例 :

#include "iostream"
using namespace std;
#include <set>
#include <algorithm>

int main() {

	// 创建一个 set 集合容器
	set<string> mySet;

	// 向容器中插入元素
	mySet.insert("b");
	mySet.insert("a");
	mySet.insert("c");

	// 向 foreach 循环中传入 Lambda 表达式
	for_each(mySet.begin(), mySet.end(), [](string str) {
		std::cout << str << " ";
		});
	cout << endl;

	// 查找容器中的元素
	set<string>::iterator it = mySet.find("a"); //find函数 默认 区分大小写

	if (it != mySet.end()) {
		cout << "找到了元素" << endl;
	} else {
		cout << "没有找到元素" << endl;
	}
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

a b c
找到了元素
Press any key to continue . . .

【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 ),c++,算法,开发语言,STL,tolower,transform,toupper


2、普通的 set 集合查找元素 - 大小写不匹配查找失败


创建普通的 set 集合 , 并插入三个元素 ;

	// 创建一个 set 集合容器
	set<string> mySet;

	// 向容器中插入元素
	mySet.insert("b");
	mySet.insert("a");
	mySet.insert("c");

集合中的元素是

a b c

在集合中查找 字符串 " A " , 找不到该元素 ;


代码示例 :

#include "iostream"
using namespace std;
#include <set>
#include <algorithm>

int main() {

	// 创建一个 set 集合容器
	set<string> mySet;

	// 向容器中插入元素
	mySet.insert("b");
	mySet.insert("a");
	mySet.insert("c");

	// 向 foreach 循环中传入 Lambda 表达式
	for_each(mySet.begin(), mySet.end(), [](string str) {
		std::cout << str << " ";
		});
	cout << endl;

	// 查找容器中的元素
	set<string>::iterator it = mySet.find("A"); //find函数 默认 区分大小写

	if (it != mySet.end()) {
		cout << "找到了元素" << endl;
	} else {
		cout << "没有找到元素" << endl;
	}
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

a b c
没有找到元素
Press any key to continue . . .

【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 ),c++,算法,开发语言,STL,tolower,transform,toupper


3、设置二元谓词规则的 set 集合查找元素 - 大小写不不敏感集合


在下面的代码中 , 创建 set 集合时 , 指定了 集合元素的 排序规则 :

	// 创建一个 set 集合容器
	set<string, Compare> mySet;

该 Compare 排序规则 是一个 二元谓词 , 在排序时 , 将字符串先转为 小写字母 , 然后进行排序 ;

/// <summary>
/// 二元谓词 大小写不敏感比较
/// </summary>
class Compare
{
public:
	bool operator()(const string& str1, const string& str2) const
	{
		// 比较的前提是不能修改实参的值
		// 这里重新创建 2 个字符串 , 用于进行比较

		// 创建字符串
		string s1;
		// 重新设置字符串大小
		s1.resize(str1.size());
		// 将字符串的所有元素都转换为小写元素
		transform(str1.begin(), str1.end(), s1.begin(), tolower); //预定义函数对象 

		string s2;
		s2.resize(str2.size());
		transform(str2.begin(), str2.end(), s2.begin(), tolower); //预定义函数对象 

		// 从小到大进行排序
		return (s1 < s2);
	}
};

在排序时 , 大小写字母不敏感 , 即使是大写字母 " A " , 也会当做 " a " 进行排序 ;

查找元素时 , 查找 " A " 字符串 , 实际上查找的是 " a " 字符串 ;

使用 find 函数 查找元素时 , 可以找到 " A " 元素 ;


代码示例 :

#include "iostream"
using namespace std;
#include <set>
#include <algorithm>
#include "functional"

/// <summary>
/// 二元谓词 大小写不敏感比较
/// </summary>
class Compare
{
public:
	bool operator()(const string& str1, const string& str2) const
	{
		// 比较的前提是不能修改实参的值
		// 这里重新创建 2 个字符串 , 用于进行比较

		// 创建字符串
		string s1;
		// 重新设置字符串大小
		s1.resize(str1.size());
		// 将字符串的所有元素都转换为小写元素
		transform(str1.begin(), str1.end(), s1.begin(), tolower); //预定义函数对象 

		string s2;
		s2.resize(str2.size());
		transform(str2.begin(), str2.end(), s2.begin(), tolower); //预定义函数对象 

		// 从小到大进行排序
		return (s1 < s2);
	}
};

int main() {

	// 创建一个 set 集合容器
	set<string, Compare> mySet;

	// 向容器中插入元素
	mySet.insert("b");
	mySet.insert("a");
	mySet.insert("c");

	// 向 foreach 循环中传入 Lambda 表达式
	for_each(mySet.begin(), mySet.end(), [](string str) {
		std::cout << str << " ";
		});
	cout << endl;

	// 查找容器中的元素
	set<string>::iterator it = mySet.find("A"); //find函数 默认 区分大小写

	if (it != mySet.end()) {
		cout << "找到了元素" << endl;
	} else {
		cout << "没有找到元素" << endl;
	}
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

a b c
找到了元素
Press any key to continue . . .

【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 ),c++,算法,开发语言,STL,tolower,transform,toupper文章来源地址https://www.toymoban.com/news/detail-782153.html

到了这里,关于【C++】STL 算法 ⑦ ( 二元谓词使用场景 - 大小写不敏感 set 集合 | tolower 函数 - 将字符转为小写字母 | 基于 tolower 实现大小写不敏感的比较函数对象 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用python判断字母大小写的几种方法

    使用Python中的内置函数 isupper() 和 islower() 来判断一个字母是否为大写或小写字母。 用户输入一个字母,程序使用isupper()和islower()函数判断字母是否为大写或小写,并输出相应的信息。如果用户输入了除字母以外的字符,程序会输出一个错误信息。 使用ASCII码值来判断字母大

    2024年02月04日
    浏览(49)
  • 【C语言数据类型】字符类型char如何使用?字母大小写转换?

    c语言基本数据类型包括 1.常量                                        2.整型和浮点型                                        3. 字符型 这篇文章来记录一下自己学习字符类型char时的笔记以及心得 (1).定义: char是用于C或C++中定义字符型变量,只占一个字节 (2).范围

    2024年02月06日
    浏览(57)
  • 【Java 笔记】使用Fastjson2时,对象转json首字母大小写问题

    开发环境: 一、JSON 转 Object 1.问题: 2.解决方案 二、Object转 JSON 三、SpringBoot设置fastjson2 为默认 pom.xml 2. 配置类 四、FastJson2 注解 默认 2. @JSONType 类注解 3. @JSONField(name = \\\"othername\\\") 属性注解 五、思考问题 Java 对象为什么需要序列化? 为什么对象没有实现Serializable接口,也可以

    2024年02月16日
    浏览(48)
  • 【蓝桥杯备赛Java组】语言基础|竞赛常用库函数|输入输出|String的使用|常见的数学方法|大小写转换

    🎥 个人主页:深鱼~ 🔥收录专栏:蓝桥杯 🌄欢迎 👍点赞✍评论⭐收藏 目录 一、编程基础 1.1 Java类的创建  1.2 Java方法  1.3 输入输出  1.4 String的使用 二、竞赛常用库函数 1.常见的数学方法 2.大小写转换 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,

    2024年01月21日
    浏览(59)
  • 【蓝桥杯备赛Java组】第一章·语言基础|竞赛常用库函数|输入输出|String的使用|常见的数学方法|大小写转换

    🎥 个人主页:深鱼~ 🔥收录专栏:蓝桥杯 🌄欢迎 👍点赞✍评论⭐收藏 目录 一、编程基础 1.1 Java类的创建  1.2 Java方法  1.3 输入输出  1.4 String的使用 二、竞赛常用库函数 1.常见的数学方法 2.大小写转换 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,

    2024年01月19日
    浏览(63)
  • Python 大小写转换

    1.lower() 将字符串中的大写字母转换成小写字母 语法:str.lower() 2.upper() 将字符串的小写字母转换为大写字母 语法:str.upper() 3.capitalize() 将字符串的第一个字母变成大写,其余字母变为小写。 语法:str.capitalize()   4.title() 返回一个满足标题格式的字符串,即所有英文单词首字

    2024年02月13日
    浏览(61)
  • MySQL:区分大小写

    本文有点不准,仅作参考;可以使用MySQL的大小写相互转换,再拼接or来规避 查看MySQL版本 show variables;  1、查看 MySQL 当前的区分大小写设置: SHOW VARIABLES LIKE \\\'lower_case_table_names\\\'; 或者 show Variables like \\\'%table_names\\\' 2、更改大小写敏感设置: 在 MySQL 5.7 中,更改大小写敏感设置要

    2024年02月03日
    浏览(66)
  • Git 忽略文件大小写

    ⏹ 遇到的情况 git提交文件的时候,默认是 不区分 大小写更改的, 这样会导致修改文件名大小写后,git提交不生效,导致代码运行失效。 也就是说默认情况下,在Git看来 SEB001.java 和 seb001.java 其实是一个文件 ⏹ 解决 使用如下命令行忽略大小写即可。 git config core.ignorecase

    2024年02月08日
    浏览(50)
  • 【ElasticSearch查询忽略大小写】

    ElasticSearch查询忽略大小写 1、常用文档类型(数据查询字段) 2、问题解决思路 2.1 查看当前索引下是否进行分词 在Kinaba中执行上述语句,结果如下: token 就是对应的分词后的结果(此处是我已经设置完了的,所以虽然存储之前是大写TEST,但是经过处理后存储的索引结果是小

    2024年02月03日
    浏览(53)
  • hive查询区分大小写

    在Hive中,默认情况下,字段名是不区分大小写的,这意味着在查询中使用大写或小写字母来引用字段名称都是可以的。其实mysql也是一样的,大部分都不会区分大小写。 但是在部分业务场景时需要对这类数据进行处理,有这么几个方法可以尝试尝试。 启用此模式后,Hive将严

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包