C++初阶 | [七] string类(上)

摘要:标准库中的string类的常用函数

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP(面向对象)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本 都使用string类,很少有人去使用C库中的字符串操作函数。

(string 类不属于 STL 【C++】-7- STL简介,属于标准库)下面介绍 string类 中比较常用、重要的函数。string类的接口设计繁多,需要时查一下文档即可。cplusplus.com/reference/string/string/


1. Constructor

关于构造函数不多赘述,参考文档可以很清楚的了解这些构造函数。→ https://cplusplus.com/reference/string/string/string/

补充说明: npos 为 string类 中的静态成员变量,类型为 无符号整型。static const size_t npos = -1 ,-1表示为无符号整型的最大值1111 1111 1111 1111 1111 1111 1111 1111 → 4,294,967,295

2. 遍历string_Element Access

operator[]

Get character of string (public member function)

at

Get character in string (public member function)

back

Access last character (public member function)

front

Access first character (public member function)

1)operator[]

像普通数组一样,以[下标]的方式访问string类对象中的成员是最常用、便捷的一种方式。同样的,这种访问方式也支持修改:

#include<iostream>
#include<string>

int main()
{
	std::string s1("Hello!");

	for (int i = 0; i < s1.size(); ++i)
	{
		std::cout << s1[i] << " ";//访问
	}
	std::cout << std::endl;

    for (int i = 0; i < s1.size(); ++i)
	{
		std::cout << ++s1[i] << " ";//修改
	}

	return 0;
}

注意: operator[] 越界,程序直接终止(assert断言处理)

2)at

at:越界抛异常

#include<iostream>
#include<string>

int main()
{
	std::string s1("Hello!");

	for (int i = 0; i < s1.size(); ++i)
	{
		std::cout << s1.at(i) << " ";
	}
	std::cout << std::endl; 

	return 0;
}

3. Iterator_迭代器

迭代器是更通用、主流的遍历方式——不是所有的容器都适用operator[],譬如链表——空间按地址不连续。为了方便理解,可以把迭代器看作指针(虽然实际底层实现可能是指针也可能不是)。

begin

Return iterator to beginning (public member function)

end

Return iterator to end (public member function)

rbegin

Return reverse iterator to reverse beginning (public member function)

rend

Return reverse iterator to reverse end (public member function)

cbegin

Return const_iterator to beginning (public member function)

cend

Return const_iterator to end (public member function)

crbegin

Return const_reverse_iterator to reverse beginning (public member function)

crend

Return const_reverse_iterator to reverse end (public member function)

#include<iostream>
#include<string>

int main()
{
	std::string s2("Hello World!");

	std::string::iterator it = s2.begin();
	while (it != s2.end())
	{
		std::cout << *it << " ";
		++it;
	}
	std::cout << std::endl;

	return 0;
}

  • 1)reverse_iterator

  • 2)范围for

    #include<iostream>
    #include<string>
    
    int main()
    {
    	for (auto e : s2)
    	{
    		std::cout << e << " ";
    	}
    
    	return 0;
    }

    范围for 本质上就是迭代器,编译器会在编译的时候替换成迭代器。

  • 3)const_iterator

    int main()
    {
    	const std::string s3("RoundBottle");
    
    	std::string::const_iterator c_it = s3.cbegin();
    	while (c_it != s3.cend())
    	{
    		std::cout << *c_it << " ";
    		++c_it;
    	}
    	std::cout << std::endl;
    
    	std::string::const_reverse_iterator cr_it = s3.crbegin();
    	while (cr_it != s3.crend())
    	{
    		std::cout << *cr_it << " ";
    		++cr_it;
    	}
    	std::cout << std::endl;
    
    	return 0;
    }

    如上代码,const 对象调用 std::string::const_iterator 和 std::string::const_reverse_iterator 。

  • ps.可以用 auto 自动识别类型——auto cr_it = s3.crbegin();

4. Capacity

size

Return length of string (public member function)

length

Return length of string (public member function)

max_size

Return maximum size of string (public member function)

resize

Resize string (public member function)

capacity

Return size of allocated storage (public member function)

reserve

Request a change in capacity (public member function)

clear

Clear string (public member function)

empty

Test if string is empty (public member function)

shrink_to_fit

Shrink to fit (public member function)

  • clear():一般只清理空间,不释放空间
  • size() and length():string 类对象结尾以 '\0' 为结束标志——为了兼容C语言 。size() and length() 都不把结尾的 '\0' 算在内,先有 length 后有 size,是为了和其他容器保持一致,“size” 这种表达更具有通用性。功能一样,都是返回 string类 的对象的长度(不包括结尾的 '\0' )。
  • reserve:提前预留空间,因为频繁的扩容是有代价的,提前预留空间可以提高效率(一般不缩容)。另外,不同平台下实际实现方案有所不同,譬如 vs编译器 下有一些对齐的规则,最终开出来的空间会比 reserve 指定的空间大小要大一点;g++平台下一般是按指定的空间大小开空间。

  • resize:改变 size 的大小。(ps.如果指定的 size 大小过大,改变 size 的大小会导致改变 capacity 的大小。

关于不同平台扩容的不同规则:vs平台一般是1.5倍扩容,g++平台一般是2倍扩容。

5. Modifiers

operator+=

Append to string (public member function)

append

Append to string (public member function)

push_back

Append character to string (public member function)

assign

Assign content to string (public member function)

insert

Insert into string (public member function)

erase

Erase characters from string (public member function)

replace

Replace portion of string (public member function)

swap

Swap string values (public member function)

pop_back

Delete last character (public member function)

  • operator+=:常用,推荐使用,可以插入字符或字符串
  • push_back:插入字符
  • append:插入一串指定字符
  • insert , erase , replace:能不用就不用。因为挪动数据,影响效率

使用示例: 

int main()
{
	std::string s2("Hello,Round Bottle");
	s2 += 'x';
	s2 += "llllll";
	s2 += "321";
	s2 += '!';

	std::cout << s2;

	s2.push_back('7');
	std::cout << s2;

	s2.append("aaaaaa");
	s2.append(3, '0');
	s2.append("alison", 2);
	std::cout << s2;

	return 0;
}

Non-member function overloads 

  • operator+ :全局函数(尽量减少用,代价很大)
    int main()
    {
    	std::string s2("Hello,Round Bottle");
    
    	std::string s3 = s2 + "777";
    	std::cout << s3 << std::endl;
    
    	return 0;
    }
    

关于Swap函数:

①std库中提供了 swap 函数模板:(3次深拷贝——1次拷贝构造+两次赋值——效率低)

②害怕成本太高,std库中又提供了现成的针对 string类对象的:(就是 Non-member function overloads 表格中所展示的 swap 函数)

③ string类中自己有 swap 成员函数:(就是 Modifiers 表格中所展示的 swap 函数)

swap 成员函数使用示例: 

int main()
{
	std::string s1("nothing");
	std::string s2("Hello,Round Bottle");

	std::cout << "s1:" << s1 << std::endl;
	std::cout << "s2:" << s2 << std::endl;

	s1.swap(s2);
	std::cout << "--------------swap---------------" << std::endl;
	std::cout << "s1:" << s1 << std::endl;
	std::cout << "s2:" << s2 << std::endl;

	return 0;
}

综上,针对交换 string类 的对象,建议使用 string类自己的成员函数 swap 进行交换——效率更高。

6. String operations

c_str

Get C string equivalent (public member function)
dataGet string data (public member function)
get_allocatorGet allocator (public member function)
copyCopy sequence of characters from string (public member function)
findFind content in string (public member function)
rfindFind last occurrence of content in string (public member function)
find_first_ofFind character in string (public member function)
find_last_ofFind character in string from the end (public member function)
find_first_not_ofFind absence of character in string (public member function)
find_last_not_ofFind non-matching character in string from the end (public member function)
substrGenerate substring (public member function)
compareCompare strings (public member function)

 c_str:与C语言接口兼容。使用示例如下:

int main()
{
	std::string s1("nothing");
	printf("%s", s1.c_str());

	return 0;
}

7. 设计string类的意义——编码

编码:值和符号一一映射对应的关系 → 编码表 (e.g. ASCII)

Unicode:万国码 ⇨ UTF 

  • UTF-8  ⇢ 兼容 ASCII(Linux → UTF-8)(Windows —— 针对中国用户 → gbk ——参考了UTF-8)
  • UTF-16
  • UTF-32

<string>

stringString class (class) ⇨ UTF-8
u16stringString of 16-bit characters (class)
u32stringString of 32-bit characters (class)
wstringWide string (class)

👆适应不同的编码,为了更好的表示世界上的各种语言。

  • wchar_t:2 byte(宽字符)⇨ wstring
  • char16_t:16 bit → 2 byte (UTF-16)
  • char32_t:32 bit → 4 byte (UTF-32)

乱码:(数)值 通过不同的编码表 得出了不同的符号——存储方式与解释方式不匹配。

GBK:GBK字库_百度百科 (baidu.com)


END

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【vue】vue-slick-carousel插件,实现横向滚动列表手动左右滚动(也可设置为自动滚动)

需求&#xff1a;图片列表横向滚动的时候&#xff0c;隐藏原始滚动条&#xff0c;通过左右箭头控制滚动条往左右按一定的步长移动。 el-carousel走马灯一滚动就是一屏&#xff0c;不适合我的需求 在npm官网搜vue-slick-carousel&#xff0c;查看更详细的配置 vue-slick-caro…

解决xshell连接诶树莓派中文乱码的问题

系统版本 解决办法 在根目录下找到 /etc/profile 修改profile文件,添加以下两行.以便重启之后也能生效: export LANGzh_CN.utf8 export LC_ALLzh_CN.utf8注意: /etc/profile的修改需要root权限才能修改! 在xshell的编码格式改为UTF-8

全志T527设置gpio口输出高电平实际输出低电平

前言 在调试T527的时候&#xff0c;主板另外添加了gpio口去控制usb口的电源开关&#xff0c;软件上面需要在内核运行的时候将gpio口设置输出高电平&#xff0c;usb口才可以正常使用。改好系统固件后&#xff0c;升级发现&#xff0c;机器开机动画过程中可以控制gpio口去打开us…

竞赛选题YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

[C国演义] 第二十三章

第二十三章 两个字符串的最小ASCLL删除和最长重复子数组 两个字符串的最小ASCLL删除和 力扣链接 求 删除字符的ASCLL和的最小值 ⇒ 正难则反 ⇒ 求公共子序列的ASCLL和的最大值 两个数组的dp问题 ⇒ 分区间讨论 ⇒ dp[i][j] -- nums1数组的[0, i] 区间 和 nums2数组的[0, j] …

《opencv实用探索·九》中值滤波简单理解

1、引言 均值滤波、方框滤波、高斯滤波&#xff0c;都是线性滤波方式。由于线性滤波的结果是所有像素值的线性组合&#xff0c;因此含有噪声的像素也会被考虑进去&#xff0c;噪声不会被消除&#xff0c;而是以更柔和的方式存在。这时使用非线性滤波效果可能会更好。中值滤波是…

手搓图片滑动验证码_JavaScript进阶

手搓图片滑动验证码 背景代码效果图展示网站 背景 在做前端项目开发的时候&#xff0c;少不了登录注册部分&#xff0c;既然有登录注册就少不了机器人验证&#xff0c;验证的方法有很多种&#xff0c;比如短信验证码、邮箱验证码、图片滑动、图片验证码等。 由于鄙人在开发中…

“团团活力圈”—“玩转柔力球 青春展风采”青少年柔力球体验活动

柔力球项目是中华优秀传统文化创造性转化、创新性发展的成功典范&#xff0c;它融合了传统太极运动方式与现代竞技双重特征于一体&#xff0c;强调内外双修&#xff0c;是一项集健身性、竞技性、表演性为一体的极富中华民族特色的体育运动。 为进一步促进柔力球运动在青少年人…

RK3588 Yolov5 部署进行目标识别

一、环境说明&#xff1a; 1、上位机 主机配置&#xff1a;win10&#xff08;强制要求win 10&#xff09;OS专业版 22H2 虚拟化软件&#xff1a;VMware pro 17.0.2&#xff1b; 虚拟机系统&#xff1a;Ubuntu20.04.1&#xff08;要求>18.0&#xff09;&#xff1b;x86-64位…

【软考S01计算机系统知识】E01 中央处理单元

E01 中央处理单元 计算机系统硬件基本组成中央处理单元组成功能 多核 CPU 计算机系统硬件基本组成 计算机系统由硬件和软件组成&#xff0c;基本硬件系统由 运算器、控制器、存储器、输入设备 和 输出设备 5大部件组成&#xff1b; 中央处理单元&#xff1a; 运算器、控制器等…

低代码简化开发流程,强大的开发利器

目录 一、与传统IT开发相比&#xff0c;低代码开发的优势 二、低代码是时代发展的产物 三、善用低代码 四、总结 软件开发已经成为企业发展不可或缺的一环。然而&#xff0c;传统的软件开发模式常常面临着繁琐冗长的工作流程、高昂的开发成本以及难以跟进快速变化的市场需求的挑…

微服务调用组件Feign

JAVA 项目中如何实现接口调用&#xff1f; 1&#xff09;Httpclient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富 的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传…

Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

服务器托管与服务器租用的详细比较

​  在当今数字化时代&#xff0c;服务器托管和服务器租用成为了许多企业和个人选择的两种常见方式。它们都提供了一种将服务器放置在专业机房中的解决方案&#xff0c;但在具体实施和使用过程中存在一些差异。下面将详细比较这两种方式的优势和劣势。 1. 服务器托管 服务器托…

Wnmp本地搭建结合内网穿透实现远程访问本地Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&a…

拒绝废话,直接开画!Python零基础教程之画图

引文 很多教程&#xff0c;开始教python&#xff0c;就是语法呀&#xff0c;字符类型这些基础的&#xff0c;虽说是基础&#xff0c;你也不能说没用。 但是&#xff0c;对于前期要快速成长的我们来说&#xff0c;属实不够看。 我们是新手&#xff0c;我们是菜鸟&#xff0c;但…

2、Linux_远程操作

远程操作 1.配置ifconfig 1.1输入 ifconfig 查看 ip 的命令( ifconfig ) 1.2搜索 ifconfig 命令&#xff08;yum search ifconfig&#xff09; 1.3配置网卡 进入如下目录配置网卡 cd /etc/syscofig/network-scripts编辑 ifcfg-ens33 vi ifcfg-ens33按 i 键进入编辑模式 按 …

好大夫数据爬取

好大夫数据爬取 问诊数据评论数据医生数据科普号数据医患交流数据 可按照疾病进行所有医生的数据&#xff0c;也可以抓所有问诊数据、评论数据 突破限制&#xff0c;快速交付

UI咨询公司-蓝蓝设计:顶级秘籍:提升UI设计吸引力的3大绝招

想要让你的UI设计在海量应用中脱颖而出&#xff0c;吸引用户眼球吗&#xff1f;如果你正在寻找提升UI设计吸引力的绝妙方法&#xff0c;那么你绝对不能错过本文&#xff01;我们将为你揭示顶级UI设计师都不会告诉你的3大绝招&#xff0c;让你轻松掌握提升UI设计吸引力的关键技巧…

光纤和光模块的那点事儿

你们好&#xff0c;我的网工朋友。 应该不少朋友在工作中会遇到光纤传输布线的活吧&#xff0c;不得不说&#xff0c;会遇上的问题还挺多&#xff0c;比如说…… 光纤收发器怎么接上不亮&#xff1f; 光纤收发器和交换机插光模块能不能搭配使用&#xff1f; 带光口的球机可…