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) |
data | Get string data (public member function) |
get_allocator | Get allocator (public member function) |
copy | Copy sequence of characters from string (public member function) |
find | Find content in string (public member function) |
rfind | Find last occurrence of content in string (public member function) |
find_first_of | Find character in string (public member function) |
find_last_of | Find character in string from the end (public member function) |
find_first_not_of | Find absence of character in string (public member function) |
find_last_not_of | Find non-matching character in string from the end (public member function) |
substr | Generate substring (public member function) |
compare | Compare 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>
string | String class (class) ⇨ UTF-8 |
u16string | String of 16-bit characters (class) |
u32string | String of 32-bit characters (class) |
wstring | Wide 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
相关文章:

C++初阶 | [七] string类(上)
摘要:标准库中的string类的常用函数 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP(面向对象)的思想&#…...

Django总结
文章目录 一、Web应用Web应用程序的优点Web应用程序的缺点应用程序有两种模式C/S、B/S C/S 客户端/服务端局域网连接其他电脑的MySQL数据库1.先用其他电脑再cmd命令行ping本机ip2.开放MySQL的访问 B/S 浏览器/服务端基于socket编写一个Web应用 二、Http协议1.http协议是什么2.h…...

【qml入门系列教程】:qml QtObject用法介绍
作者:令狐掌门 技术交流QQ群:675120140 博客地址:https://mingshiqiang.blog.csdn.net/ 文章目录 QtObject 是 Qt/QML 中的一个基础类型,通常用作创建一个没有 UI 的(不渲染任何东西的)纯逻辑对象。可以使用它来组织代码、存储状态或者作为属性和方法的容器。 以下是如何…...

2分图匹配算法
定义 节点u直接无边,v之间无边,边只存在uv之间。判断方法:BFS染色法,全部染色后,相邻边不同色 无权二部图中的最大匹配 最大匹配即每一个都匹配上min(u, v)。贪心算法可能导致&…...

[EndNote学习笔记] 导出库中文献的作者、标题、年份到Excel
菜单栏Edit中,选择 Output Styles 在默认的 Annotated上进行修改,在Bibliography栏下的Templates中修改想要导出的格式 其中,每个粗体标题表示,针对不同的文献类型,设置相应的导出格式。一般为Journal Article&…...

SQL Sever 基础知识 - 数据查询
SQL Sever 基础知识 - 一、查询数据 一、查询数据第1节 基本 SQL Server 语句SELECT第2节 SELECT语句示例2.1 SELECT - 检索表示例的某些列2.2 SELECT - 检索表的所有列2.3 SELECT - 对结果集进行筛选2.4 SELECT - 对结果集进行排序2.5 SELECT - 对结果集进行分组2.5 SELECT - …...

Vue入门——v-on标签
文章目录 规则v-on 一、案例总结 规则 v-on 作用:为html标签绑定事件语法: v-on:事件名:“函数名”简写为 事件名“函数名” 注意:函数需要定义在methods选项内部 一、案例 我们给案件绑定一个单击事件 <!DOCTYPE…...

JVM:双亲委派(未完结)
类加载 定义 一个java文件从编写代码到最终运行,必须要经历编译和类加载的过程,如下图(图源自b站视频up主“跟着Mic学架构”)。 编译就是把.java文件变成.class文件。类加载就是把.class文件加载到JVM内存中,得到一…...

Leetcode 2661. 找出叠涂元素
Leetcode 2661. 找出叠涂元素题目 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。arr 和 mat 都包含范围 [1,m * n] 内的 所有 整数。从下标 0 开始遍历 arr 中的每个下标 i ,并将包含整数 arr[i] 的 mat 单元格涂色。请你找出 a…...

vscode代码调试配置
C/C代码调试 点击 vscode左侧的 run and debug,新建launch.json 和 tasks.json,并进行配置如下 launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more informati…...

PTA 7-225 sdut-C语言实验- 冒泡排序中数据交换的次数
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。 输入格式: 输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。 接下来T行,每行…...

新的 BLUFFS 攻击导致蓝牙连接不再私密
蓝牙是一种连接我们设备的低功耗无线技术,有一个新的漏洞需要解决。 中间的攻击者可以使用新的 BLUFFS 攻击轻松窥探您的通信。 法国研究中心 EURECOM 的研究员 Daniele Antonioli 演示了六种新颖的攻击,这些攻击被定义为 BLUFFS(蓝牙转发和…...

安全测试之推荐工具(一)
文章目录 一、前言二、Web安全(一)AppScan(推荐)(二)AWVS(推荐)(三)Burp Suite(推荐)(四)OWASP ZAP 三、主机安…...

final关键字
修饰 类,属性,方法,局部变量(包括方法参数) 类似c语言的const 使用方式: 1 不希望类被继承 用final类(类很重要,担心别人重写/修改) 2 不希望某…...

WPF MVVM模式下如何将UI窗口变量传参到Viewmodel层
WPF MVVM模式下如何将UI窗口变量传参到Viewmodel层 UI层窗口定义 //窗口中绑定ViewModel<hc:GlowWindow.DataContext><viewmodel:MainWindowViewModel /></hc:GlowWindow.DataContext>//注册初始化事件<hc:Interaction.Triggers><hc:EventTrigger…...

条款22:将成员变量声明为private
1.前言 首先,我们应该利用反证法,看看为什么成员变量不该是public,然后再了解所有反对public成员变量的论点同样适用于protected成员变量。最后得出一个结论:成员变量应该是private。 2.为什么不用public 如果成员变量不是publ…...

PTA 7-224 sdut-C语言实验-排序问题
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。 输入格式: 输入数据有一行,包含10个整数,用空格分开。 输出格式: 输出数据有两行,第一行为排序后的序列,第二行为排序…...

【JavaScript】3.2 JavaScript性能优化
文章目录 1. 避免全局查找2. 避免不必要的属性查找3. 使用快速的JavaScript方法4. 避免不必要的DOM操作5. 使用Web Workers进行后台处理总结 性能优化是任何编程语言的重要组成部分,JavaScript也不例外。在这个章节中,我们将探讨如何优化JavaScript代码&…...

pytorch bert实现文本分类
以imdb公开数据集为例,bert模型可以在huggingface上自行挑选 1.导入必要的库 import os import torch from torch.utils.data import DataLoader, TensorDataset, random_split from transformers import BertTokenizer, BertModel, BertConfig from torch import…...

《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖
你是否曾想过,元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的?在本期的《开箱元宇宙》 系列中,我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2,000 个人物化身系列,以及是什么原…...

4K-Resolution Photo Exposure Correction at 125 FPS with ~8K Parameters
MSLTNet开源 | 4K分辨率125FPS8K的参数量,怎养才可以拒绝这样的模型呢? 错误的曝光照片的校正已经被广泛使用深度卷积神经网络或Transformer进行广泛修正。尽管这些方法具有令人鼓舞的表现,但它们通常在高分辨率照片上具有大量的参数数量和沉…...

网络初识:局域网广域网网络通信基础
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、局域网LAN是什么?二、广域网是什么:三. IP地址四.端口号五.认识协议5.1五元组 总结 前言 一、局域网LAN是什么? 局域网…...

JVM之jps虚拟机进程状态工具
jps虚拟机进程状态工具 1、jps jps:(JVM Process Status Tool),虚拟机进程状态工具,可以列出正在运行的虚拟机进程,并显示虚拟机执 行主类(Main Class,main()函数所在的类)的名称,…...

C++实现顺序栈的基本操作(扩展)
#include <stdio.h> typedef char ElemType; #define StackSize 100 /*顺序栈的初始分配空间*/ typedef struct { ElemType data[StackSize]; /*保存栈中元素*/int top; /*栈顶指针*/ } SqStack; void InitStack(SqStack &st) {st.top-1; } …...

用python写一个简单的爬虫
爬虫是一种自动化程序,用于从互联网上获取数据。它能够模拟人类浏览网页的行为,访问网页并提取所需的信息。爬虫在很多领域都有广泛的应用,例如数据采集、信息监控、搜索引擎索引等。 下面是一个使用Python编写的简单爬虫示例: …...

分布式追踪
目录 文章目录 目录自定义指标1.删除标签2.添加指标3.禁用指标 分布式追踪上下文传递Jaeger 关于我最后最后 自定义指标 除了 Istio 自带的指标外,我们还可以自定义指标,要自定指标需要用到 Istio 提供的 Telemetry API,该 API 能够灵活地配…...

make -c VS make -f
make 是一个用于构建(编译)项目的工具,它通过读取一个名为 Makefile 的文件来执行构建任务。make 命令有很多选项和参数,其中包括 -c 和 -f。 make -c: 作用:指定进入指定的目录并执行相应的 Makefile。 示…...

Unity 代码控制Color无变化
Unity中,我们给Color的赋值比较常用的方法是: 1、使用预定义颜色常量: Color color Color.white; //白色 Color color Color.black; //黑色 Color color Color.red; //红色 Color color Color.green; //绿色 Color color Color.blue; …...

【Erlang进阶学习】2、匿名函数
受到其它一些函数式编程开发语言的影响,在Erlang语言中,将函数作为一个对象,赋予其“变量”的属性,即为我们的匿名函数 或 简称 fun,它具有以下特性: (匿名函数:不是定义在Erlang模…...

肖sir__mysql之视图__009
mysql之视图 一、什么是视图 视图是一个虚拟表(逻辑表),它不在数据库中以存储形式保存(本身包含数据),是在使用视图的时候动态生成。 二、视图作用 1、查询数据库中的非常复的数据 例如:多表&a…...