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

news2024/11/28 14:53:24

摘要:标准库中的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

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

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

相关文章

区块链创新应用场景不断拓展,实现去中心化

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 区块…

网络知识学习(笔记三)(传输层的TCP)

前面已经介绍了传输层的UDP协议的报文以及一下相关的知识点&#xff0c;本次主要是传输层的TCP协议&#xff0c;包括TCP报文的详细介绍&#xff1b;可靠传输、流量控制、拥塞控制等&#xff1b;建立连接、释放连接。 一、TCP基本知识点介绍 1.1、TCP协议的几个重要的知识点 …

联想电脑重装系统Win10步骤和详细教程

联想电脑拥有强大的性能&#xff0c;很多用户办公都喜欢用联想电脑。有使用联想电脑的用户反映系统出现问题了&#xff0c;想重新安装一个正常的系统&#xff0c;但是不知道重新系统的具体步骤。接下来小编详细介绍给联想电脑重新安装Win10系统系统的方法步骤。 推荐下载 系统之…

Elastcsearch:通过 Serverless 提供更多服务

作者&#xff1a;Ken Exner 人们使用 Elasticsearch 解决最大数据挑战的方式一直令我们感到惊讶。 从超过 40 亿次下载、70,000 次提交、1,800 名贡献者以及我们全球社区的反馈中可以清楚地看出这一点。 Elastic 在广泛的用例中发挥的作用促使我们简化复杂性&#xff0c;让搜索…

2023年12月8日:UI登陆界面

作业 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QPushButton> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpub…

Liunx系统使用超详细(五)~命令符号

目录 一、逻辑符号 1.1&& 1.2|| 二、连接符号 2.1| 2.2> 2.3>> 2.4< 三、分隔符号 3.1 &#xff1b; 在Linux中&#xff0c;逻辑符号和连接符号常用于构建命令行中的逻辑操作和管道操作。下面对这两种符号进行总结描述。 一、逻辑符号 1.1&…

运维知识点-Nginx

Nginx Nginx解析安全实战预备知识实验目的#制作图片木马# web服务器-Nginx服务命令及配置centOS7安装安装所需插件安装gccpcre、pcre-devel安装zlib安装安装openssl Nginx解析安全实战 预备知识 NginxPHP/FastCGI构建的WEB服务器工作原理 Nginx|FastCGI简介 Nginx (“engin…

Spring--10--Spring Bean的生命周期

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Spring Bean1.1 什么是 Bean简而言之&#xff0c;bean 是由 Spring IoC 容器实例化、组装和管理的对象。 1.2 Spring框架管理Bean对象的优势 2.Bean的生命周期实例…

Linux shell编程学习笔记34:eval 命令

0 前言 在JavaScript语言中&#xff0c;有一个很特别的函数eval&#xff0c;eval函数可以将字符串当做 JavaScript 代码执行&#xff0c;返回表达式或值。 在Linux Shell 中也提供了内建命令eval&#xff0c;它是否具有JavaScript语言中eval函数的功能呢&#xff1f; 1 eval命…

MuJoCo机器人动力学仿真平台安装与教程

MuJoCo是一个机器人动力学仿真平台&#xff0c;它包括一系列的物理引擎、可视化工具和机器人模拟器等工具&#xff0c;用于研究和模拟机器人的运动和动力学特性。以下是MuJoCo的安装教程&#xff1a; 下载和安装MuJoCo Pro。可以从MuJoCo的官方网站上下载最新版本的安装包。根…

QT Creator 保存(Ctrl+S)时,会将Tab制表符转换为空格

今天在写makefile文件时&#xff0c;发现QT Creator 保存(CtrlS)时&#xff0c;会将Tab制表符转换为空格&#xff0c;之前没有发现&#xff0c;略坑&#xff0c;官网上也有说明&#xff0c;点这里 简单来说&#xff0c;解决办法如下 依次点击&#xff1a;Tools ->Options-&g…

数据结构与算法(六)分支限界法(Java)

目录 一、简介1.1 定义1.2 知识回顾1.3 两种解空间树1.4 三种分支限界法1.5 回溯法与分支线定法对比1.6 使用步骤 二、经典示例&#xff1a;0-1背包问题2.1 题目2.2 分析1&#xff09;暴力枚举2&#xff09;分支限界法 2.3 代码实现1&#xff09;实现广度优先策略遍历2&#xf…

SpringBoot系列之集成Jedis教程

SpringBoot系列之集成Jedis教程&#xff0c;Jedis是老牌的redis客户端框架&#xff0c;提供了比较齐全的redis使用命令&#xff0c;是一款开源的Java 客户端框架&#xff0c;本文使用Jedis3.1.0加上Springboot2.0&#xff0c;配合spring-boot-starter-data-redis使用&#xff0…

【CVE 复现】CVE-2022-0185 fsconfig之整数溢出

影响版本&#xff1a;Linux-v5.1~v5.16.2 测试版本&#xff1a;Linux-5.11.22&#xff0c;由于懒得搞环境&#xff0c;所以直接用的 bsauce 大佬提供的 测试环境 看看 patch&#xff1a; diff --git a/fs/fs_context.c b/fs/fs_context.c index b7e43a780a625b..24ce12f0db32…

Linux---日志管理

本章主要介绍Linux中的日志管理 了解rsyslog是如何管理日志的查看日志的方法 日志管理简介 工作当中的日志&#xff0c;特指硬件和软件的日志&#xff0c;管理员可以通过它来检查错误发生的原因&#xff0c;或者寻找受到攻击时攻击者留下的痕迹。日志管理包括管理系统日志、应…

三数组最小距离:2020年408算法题

算法思想 算法实现 #define INT_MAX 0x7fffffff //c语言int类型最大值 //计算绝对值 int abs(int a){if(a<0) return -a;else return a; } //判断a是否为3个数中最小值 bool isMin(int a,int b,int c){if(a<b&&a<c) return true;return false; }//主函数 in…

SpringCloud 微服务集群升级记录(1.5.x-2.7.18)

前言 前段时间&#xff0c;因项目被扫出大量漏洞&#xff0c;全是因为依赖版本过低&#xff0c;存在高中危漏洞需要升级。正好本来也有规划集群升级&#xff0c;因为工作量大迟迟落实不了&#xff0c;正好有这次修漏洞的机会&#xff0c;升级微服务集群。这篇文章主要记录了本…

案例053:基于微信小程序的乐室预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

如何快速完成企业私有云部署

快解析赋能企业私有云部署 ​ 很多企业形成了以总部为中心的多点生产体系结构&#xff0c;并借助网络化办公工具搭建跨区域协同办公系统&#xff0c;满足总部与分支机构间的信息互通&#xff0c;进而促进异地业务的信息共享&#xff0c;提高办公处理效率和综合管理水平。 北…

redis-学习笔记(string)

redis 中的字符串, 是按照二进制的方式存储和读取的, 即存啥取啥, 所以一般不会出现乱码问题 (乱码问题是因为存储和读取时使用的编码方式不一样, 但是 redis 没有编码转换) redis 限制了 string 的大小 : 512M, 因为 单线程模型 希望进行的操作能够比较快速, 越大越慢 set key…