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

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

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

相关文章

03、pytest初体验

官方实例 # content of test_sample.py def func(x):return x 1def test_ansewer():assert func(3) 5步骤解释 [100%]指的是所有测试用例的总体进度&#xff0c;完成后&#xff0c;pytest显示一个失败报告&#xff0c;因为func(3)没有返回5 注意&#xff1a;你可以使用ass…

【滤波第二期】中值滤波的原理和C代码

中值滤波是一种非线性数字滤波技术&#xff0c;主要应用于信号处理和图像处理领域&#xff0c;用于减小信号中的噪声和离群值。中值滤波的核心思想是通过计算一组数据点的中间值&#xff0c;以抑制脉冲噪声等离群值的影响&#xff0c;从而实现信号的平滑处理。 1&#xff0c;中…

PIL、cv2读取类型以及转换,PIL、numpy、tensor格式以及cuda、cpu的格式转换

一、PIL&#xff0c;cv2读取数据图片以及之间的转换 cv2PIL读取acv2.imread()aImage.open()读取类型数组类型PIL类型读取尺寸排列&#xff08;H,W,C&#xff09;&#xff08;W,H,C&#xff09;显示图片cv2.imshow(“a”, a)cv2.waitKey (0)a.show()相互之间转换显示Image.from…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(5)》(21)

《Linux操作系统原理分析之linux存储管理&#xff08;5&#xff09;》&#xff08;21&#xff09; 6 Linux存储管理6.6 Linux 物理空间管理6.6.1 Linux 物理内存空间6.6.2 物理页面的管理6.6.3 空闲页面管理——buddy 算法 6.7 内存的分配与释放6.7.1 物理内存分配的数据结构 6…

canvas绘制小丑

说明&#xff1a; 借鉴博主基于canvas绘制一个爱心(10行代码就够了) - 掘金 (juejin.cn) 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

实现简单的Http服务器+SpringMvc,集成到Spring

实现简单的Http服务器SpringMvc&#xff0c;集成到Spring 1、Http协议 1.1、HTTP 协议请求格式 方法 空格 URL 空格 版本 回车符 换行符头部域名称&#xff1a;头部域值 回车符 换行符...头部域名称&#xff1a;头部域值 回车符 …

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-03-嵌入式

文章目录 1. 基本概念2. 嵌入式系统的组成3. 嵌入式系统的特点4. 嵌入式系统分类4.1 分类4.2 实时系统(Real-Time System,RTS)4.3 安全攸关系统 (Safety-Critical System)7. 嵌入式软件7.1. 嵌入式系统软件组成架构7.1.1 硬件层7.1.2 抽象层7.1.3 操作系统层7.1.4 中间件层7.1…

【云备份】服务端热点管理业务处理模块

28. 服务端热点管理模块实现-热点管理实现思路 服务器端的热点文件管理是对上传的非热点文件进行压缩存储&#xff0c;节省磁盘空间。 而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内&#xff0c;比如如果一个文件一天都没有被访问过我们就认为这是…

【UGUI】sprite精灵的创建与编辑

如何切图&#xff08;sprite editor&#xff09; 有时候一张图可能包含了很多张子图&#xff0c;就需要在Unity 临时处理一下&#xff0c;切开&#xff0c;比如动画序列帧图集 虽然我们可以在PS里面逐个切成一样的尺寸导出多张&#xff0c;再放回Unity&#xff0c;但是不需要这…

音视频技术开发周刊 | 322

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 超级AI不会主宰人类&#xff0c;但人工智能必须开源&#xff01;LeCun最新采访引全网300万人围观 LeCun最新访谈视频中&#xff0c;再次坦露了自己对开源AI的看法。超级AI…

安路Anlogic FPGA下载器的驱动安装教程

安路FPGA下载器驱动安装教程 安路FPGA下载器&#xff1a;EN-ALC10,是一款高性能FPGA下载线&#xff08;编程器&#xff09;&#xff0c;支持安路的开发软件TDS和全系列FPGA芯片下载编程&#xff0c;支持全速USB2.0与电脑进行数据通信&#xff0c;通过JTAG协议与FPGA进行程序下…

鸿蒙开发:UIAbility组件间交互探索实战【鸿蒙专栏-22】

UIAbility组件间交互(设备内) 在设备内,UIAbility(用户界面能力)是系统调度的最小单元,它们负责展示用户界面和执行相关的业务逻辑。设备内的不同功能模块之间的交互是应用程序开发中的重要部分。本文将探讨设备内UIAbility之间的交互方式,包括启动应用内的UIAbility、…

LeetCode330. Patching Array

文章目录 一、题目二、题解 一、题目 Given a sorted integer array nums and an integer n, add/patch elements to the array such that any number in the range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of…

Redux

一、纯函数 1、react 中的纯函数 react 中组件就被要求像是一个纯函数&#xff08;因为还有类组件&#xff09;redux 中有一个reducer 的概念&#xff0c;也是要求必须是一个纯函数 2、 纯函数的条件 确定的输入一定会产生确定的输出函数在执行过程中&#xff0c;不能产生副…

vue自定义指令:指定文字高亮

vue自定义指令&#xff1a;指定文字高亮 自定义指令 除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对…

【重点】【区间问题】56.合并区间

题目 注意有个类似的题目&#xff1a;&#xff0c;注意区分。 class Solution {public int[][] merge(int[][] intervals) {List<List<Integer>> res new ArrayList<>();Arrays.sort(intervals, (a1, a2) -> {return a1[0] - a2[0];});int left Intege…

JS实现成才网注册系统(网页数据验证)

主代码 <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Conten…

Hadoop进阶学习---HDFS分布式文件存储系统

1.hdfs分布式文件存储的特点 分布式存储:一次写入,多次读取 HDFS文件系统可存储超大文件,时效性较差. HDFS基友硬件故障检测和自动快速恢复功能. HDFS为数据存储提供很强的扩展能力. HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改. HDFS可以在普通廉价的机器…

Linux: 文档 :相关接口文档手册还是需要仔细阅读

接口文档的阅读&#xff0c;一定要仔细。最近遇到一个问题&#xff0c;明明文档里有说&#xff0c;read函数读取到的是一个或者多个events&#xff0c;但是代码里依然按照一个来处理。就会导致漏event的可能。漏了event&#xff0c;后续的逻辑就会受影响。 Each successful rea…

llama.cpp部署(windows)

一、下载源码和模型 下载源码和模型 # 下载源码 git clone https://github.com/ggerganov/llama.cpp.git# 下载llama-7b模型 git clone https://www.modelscope.cn/skyline2006/llama-7b.git查看cmake版本&#xff1a; D:\pyworkspace\llama_cpp\llama.cpp\build>cmake --…