C++STL字符串string知识汇总,恶补!

基础不牢,地动山摇。
今天小米的笔试编程题,输入格式是一整个字符串,需要从字符串中分割出数据,同时还需要将字符串转换为int数值。
本来用C++写,写到一般想起来了C++中没有split()函数,想到在java中有这个函数,于是又换到了Java语言,但是Java的输入、输出又不方便,唉~~
这波,让我狠狠地补一下string的知识

今天来将C++ STL中,与字符串相关的东西总结一下。

string

在C++中,用string类变量来表示一个字符串,相比于C中的char[],更简单。

创建string字符串对象

创建一个string对象

string s; // 1. 一个空的字符串对象string s1 = "lmk"; // 2. 创建指定内容的字符串char st[] = {'1','a','b'};
string s2(st);// 3. 根据char[] 创建字符串string s3(10, 'c'); // 4. 生成包含n个指定字符的字符串

常规用法

string字符串本质还是一个char[],所以我们可以利用[]来访问指定位置的字符

string str = "abc";
cout << str[0] << endl;
cout << str[2] << endl;

string重载了++=运算法,这两个运算符对于string对象,就是字符串拼接操作

string str = "abc";
cout << str + "1234" << endl;str += "xyz";
cout << str << endl;str += 'Y';
cout << str << endl;

string中常用的成员方法

迭代器:

  1. begin()用来标识字符串的起始位置,即第一个字符的位置
  2. end(),用来表示字符串的结束位置,即最后一个字符的下一个位置

基本成员方法

首先是基本的成员方法

  1. 获取字符串长度size()length()
  2. 判断字符串是否为空empty()
  3. 清空字符串clear()
string str = "lmkdsb";
cout << str.size() << " || " << str.length() << endl;
str.clear();
cout << str.size() << " || " << str.length() << endl;
cout << str.empty() << endl;

添加

字符串长度增加相关的方法

  1. 尾插单个字符push_back(char ch)
  2. 追加字符串,append(string str),此方法的参数是一个字符串,追加字符串后面
  3. 插入字符或字符串`insert(int pos, string)
string str = "lmkdsb";str.push_back('x'); // 追加单个字符
cout << str << endl;str.append("123"); // 追加字符串
cout << str << endl;str.insert(1, "xyz"); // 在指定索引处插入字符串
cout << str << endl;str.insert(str.end(), 'Y'); // 如果要使用insert()在指定索引处插入一个字符,必须要使用迭代器来指明位置
cout << str << endl;

删除

删除字符串相关的方法

  1. 删除最后的那个字符,尾删pop_back()
  2. 删除指定位置的一个或一些字符earse()
string str = "lmkdsbxxxw";str.pop_back(); // 删除末尾的单个字符
cout << str << endl;str.erase(6);// 从pos索引开始删除,一直到最后
cout << str << endl;str.erase(2, 3); // 从索引为2的位置开始,删除3个元素
cout << str << endl;str.erase(str.begin() + 1, str.end() - 1); // 配合迭代器,删除[start, end)之间的元素
cout << str << endl;

查找

字符串查找:

  1. find()从左侧开始查找,返回起始位置的坐标
  2. rfind()从右侧开始查找,返回起始位置的坐标
    这两个方法如果找不到,那么就会返回string::npos,(no position),此成员变量用来表示没有找到目标字符串。
    此成员是一个long long unsigned int类型的变量(64位无符号整型),npos转换为int是会溢出,最终转换为int是-1
string str = "lmkdsbm";cout << str.find('m') << endl;  // 查找单个字符
cout << str.find("mk") << endl; // 查找子字符串
cout << str.find('m',1) << endl; //从指定位置开始查找,从[pos, ]开始查找// 从右边开始查找
cout << str.rfind('m') << endl;
cout << str.rfind("mk") << endl;
cout << str.rfind('m', 3) << endl; // 从指定位置开始查找// 找不到会返回npos
cout << str.find('x') << endl; // 结果是 18446744073709551615
int pos = str.find('x'); // 转换为int会溢出,最终结果是-1
cout << pos << endl;

此外,还有两个查找相关的方法,与find()、rfind()相似:

  1. find_first_of查找第一个出现的位置
  2. find_last_of查找最后出现的位置
string str = "lmkdsbmx";
// 查找第一个出现的位置
cout << str.find_first_of('m') << endl;
cout << str.find_first_of('m', 1) << endl; // 从指定位置开始查找// 查找第一个不包含指定子串的位置
cout << str.find_first_not_of('m', 1) << endl;cout << str.find_last_of('m') << endl; // 寻找最后出现的位置
cout << str.find_last_not_of('m') << endl; // 寻找最后不出现目标字符串的位置

两个字符串交换内容,swap(string str)

string str = "abc";
string tmp ="1231";
str.swap(tmp); // swap()的参数必须是一个变量,不能是一个字符串常量,str.swap("123")这种写法是不可以的
cout << str << endl;
cout << tmp << endl;

替换

replace(pos, n, string&)从pos位置开始长度为n的这段区间替换为str。
replace(pos,n, m, char ch)从pos位置开始长度为n的这段区间替换为m个ch

string str = "abcdef";str.replace(2,2, "lmk"); 
cout << str << endl;string s = "xyzw";
s.replace(1,2,8,'k');
cout << s << endl;

字符串分割

substr(pos, n)从字符串中分割出子串,从pos位置开始,截取n个字符并返回

string str = "abc123";
cout << str.substr(2) << endl; // 从指定位置开始截取,一直到结尾
cout << str.substr(3,3) << endl; // 从指定位置pos开始截取n个字符

在C++中,并没有split()函数,其他语言中都有这个函数,这个函数的作用就是按照指定的字符串作为分割,返回分割后的结果。
例如,string str = "13,2,3",按照split()所说的,我们按照逗号,进行分割,分割后的结果应该是一个数组,["13,"2","3]"
我们可以手动实现这个函数,实现的思路有很多种,我们这里以find()substr()来实现

vector<string> split(string str, string separator){vector<string> res;int pos = str.find(separator);while(pos != -1){string part = str.substr(0, pos);res.push_back(part);str = str.substr(pos + 1);pos = str.find(separator);}if(!str.empty()){res.push_back(str);}return res;
}

关于更多split()方法的实现方式可以看Site Unreachable

其他操作

字符转换大小写

  • tolower(char ch) 将一个字符转换为小写并返回
  • toupper(char ch)将一个字符转换为大写并返回
char ch = 'a';
ch = toupper(ch); // 转换为大写
cout << ch << endl;ch = tolower('Q'); // 转换为小写
cout << ch << endl;ch = tolower('2'); // 如果不能转换,则原样返回
cout << ch << endl;

字符判断

判断一个字符是不是字母、是不是大/小写字母、是不是数字

cout << isupper('A') << endl;   // 是否是大写字母
cout << isupper('a') << endl;cout << islower('A') << endl;   // 是否为小写字母cout << isdigit('1') << endl;   // 是否是数字
cout << isdigit('x') << endl;cout << isalpha(',') << endl; // 是否为字母
cout << isalpha('X') << endl; 

string字符串与其他基本数据类型的转换

对于string字符串风格的对象来说,将一个string转换为int,可以使用stoi(string& str)函数,除此之外还有:

  • stoi(), string对象转换为int
  • stof(),string对象转换为float
  • stod(),string对象转换为double
  • stoll(),string对象转换为long long
string str = "123";
int num = stoi(str); // string 转换为int
cout << num + 5 << endl;str = "123.456"; // 转换为float
cout << stof(str) + 0.1 << endl;cout << stod(str) << endl; // 转换为doublestr = "123212354312523292";
long long x = stoll(str);
cout << x << endl; // 转换为long long 类型

你可能还听说过C 函数库中有一个atoi()将字符串转换为int,这个atoi(char* s)函数的参数是一个C风格的字符串,即一个char的数组,不能传递string对象作为参数。

其他数据类型转换为string

可以调用to_string()函数,该方法是C++11中新增的,该函数可以将其他所有的基本数据类型转换为字符串

string s = to_string(123);
s.pop_back();
cout << s << endl;string st = to_string(123.456);
cout << st << endl;

字符串反转

可以直接调用STL中的reverse()函数,
该函数需要两个参数:

  • 第一个参数,容器的起始位置
  • 第二个参数,容器的结束位置
string str = "abcdef";
reverse(str.begin(), str.end());
cout << str << endl;

sort()与string

我们知道STL中,sort()是对容器内元素进行排序的,同样也支持对string对象中字符的排序,因为我们可以把string对象看做盛放字符的容器。
众所周知,sort()函数至少需要两个参数:

  • 第一个是容器的开始位置,
  • 第二个是结束位置,
  • 第三个参数是可选的,自定义排序规则。
string str = "cbadfe";
sort(str.begin(), str.end());
cout << str << endl; // 结果是 abcdef

对于sort()函数来说,如果不传入自定义的比较规则,则会按照从小到大的顺序排序,对于字符来说,会按照字典序排序。

transform()

transform()函数的作用就是将一个容器中的所有元素做出转换。
比如,我的字符串是"abc"可以利用transform()将字符串中的元素全部转换为大写"ABC"
transform()有多个重载形式,对于string来说,就这种形式比比较常用

transform(begin, end, res, operation)
  • begin容器的起始位置
  • end容器的结束位置
  • res,用来接受转换完成后的结果,从哪个变量的哪个位置开始接收转换后的结果
  • operation,具体的转换逻辑,我们可以使用STL内置的函数,也可以自定义
    以转换大写字母为例,
string str = "abcdefg";
transform(str.begin(), str.end(), str.begin(), ::toupper);// ::这两个冒号不可以省略
cout << str;

当然自定义逻辑也是很简单的

// 是大写就转换为小写,是小写就转换为大写
char myChange(char ch){if(isupper(ch)){return tolower(ch);}else{return toupper(ch);}
}
int main()
{string str = "aBcDeFg";transform(str.begin(), str.end(), str.begin(), myChange);// ::这两个冒号不可以省略cout << str;return 0;
}

参考文章

  • 【C++】STL——string类详解
  • C++STL详解(一)—— string类_c++ stl string_2021dragon的博客-CSDN博客

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

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

相关文章

Linux安装包deb格式安装方法

deb格式介绍 DEB是Debian软件包格式的文件扩展名&#xff0c;跟Debian的命名一样&#xff0c;DEB也是因Debra Murdock而得名&#xff0c;她是Debian创始人Ian Murdock的太太。 安装方法 主要有两种: apt: 支持离线在线的结合安装,主要解决部分安装包依赖不全的问题dpkg: 纯…

【探索SpringCloud】服务发现-Nacos服务端数据结构和模型

前言 上一文中&#xff0c;我们从官方的图示了解到Nacos的服务数据结构。但我关心的是&#xff0c;Nacos2.x不是重构了吗&#xff1f;怎么还是这种数据结构&#xff1f;我推测&#xff0c;必然是为了对Nacos1.x的兼容&#xff0c;实际存储应该不是这样的。于是&#xff0c;沿着…

VueRouter的基本使用

路由的基本使用 文章目录 路由的基本使用01-VueRouterVueRouter的使用 &#xff08; 5 2&#xff09;综合代码 拓展&#xff1a;组件存放问题 什么是路由呢&#xff1f; 在生活中的路由&#xff1a;设备和IP的映射关系 在Vue中&#xff1a;路径 和 组件 的 映射 关系。 01-Vu…

怎么从0到1创建一个PHP框架-1?

写在前面 本人开发的框架在2021年年初开发完成&#xff0c;后面没有再做过任何维护和修改。是仅供大家参考交流的学习项目&#xff0c;请勿使用在生产环境&#xff0c;也勿用作商业用途。 框架地址&#xff1a; https://github.com/yijiebaiyi/fast_framework 整体思路 开发…

SpringBoot第45讲:SpringBoot定时任务 - Timer实现方式

SpringBoot第45讲:SpringBoot定时任务 - Timer实现方式 定时任务在实际开发中有着广泛的用途,本文是SpringBoot第45讲,主要帮助你构建定时任务的知识体系,同时展示Timer 的schedule和scheduleAtFixedRate例子;后续的文章中我们将逐一介绍其它常见的定时任务,并与SpringBo…

并发测试工具 apache-jmeter使用发送post请求JSON数据

目录 1 下载安装 2 汉化 3 创建高并发测试 配置线程组 创建web请求 创建监听器 结果树 汇总报告 为web请求添加token 添加Content-Type用于发送json 4 启动测试 5 查看结果 1 下载安装 官网Apache JMeter - Download Apache JMeter 解压运行 2 2 汉化 打开软件…

【Mysql系列】(一)MySQL语句执行流程

首发博客地址 首发博客地址 系列文章地址 参考文章 MySQL 逻辑架构 连接器 连接命令一般是这么写的 mysql -h$ip -P$port -u$user -p 那么 什么是连接器&#xff1f; MySQL 连接器&#xff08;MySQL Connector&#xff09;是用于连接和与 MySQL 数据库进行交互的驱动程序。它提…

远程管理通道安全SSH协议主机验证过程

可以使用SSH协议进行远程管理通道安全保护&#xff0c;其中涉及的主要安全功能包括主机验证、数据加密性和数据完整性保护。 这里要注意的是【主机验证】和【身份验证】的区别&#xff0c;主机验证是客户端确认所访问的服务端是目标访问对象&#xff0c;比如从从客户端A(192.16…

MongoDB 的简介

MongoDB 趋势 对于 MongoDB 的认识 Q&A QA什么是 MongoDB&#xff1f; 一个以 JSON 为数据模型的文档数据库一个以 JSON 为数据模型的文档数据库文档来自于“JSON Document”&#xff0c;并非我们一般理解的 PDF&#xff0c;WORD谁开发 MongDB&#xff1f; 上市公司 MongoD…

【USRP】产品型号、参数、架构全解析系列 1:B200 / B210 / B200mini / B205mini

一、 USRP 简介 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发&#xff0c;被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过以太网线连接到主机&a…

每日一题 1372二叉树中的最长交错路径

题目 给你一棵以 root 为根的二叉树&#xff0c;二叉树中的交错路径定义如下&#xff1a; 选择二叉树中 任意 节点和一个方向&#xff08;左或者右&#xff09;。如果前进方向为右&#xff0c;那么移动到当前节点的的右子节点&#xff0c;否则移动到它的左子节点。改变前进方…

flutter plugins插件【三】【Flutter Intl】

3、 Flutter Intl 多语言国际化 在Android Studio中菜单Tools找到flutter intl创建多语言配置。 创建后会在pubspec.yaml出现 flutter_intl:enabled: true 在工程的lib会生成l10n与generated文件夹 l10n包含 intl_en.arb intl_zn.arb 我们在intl_en.arb添加 { home: &quo…

青翼科技基于VITA57.1的16路数据收发处理平台产品手册

FMC211是一款基于VITA57.1标准规范的实现16路LVDS数据采集、1路光纤数据收发处理FMC子卡模块。 该板卡支持2路CVBS&#xff08;复合视频&#xff09;视频输入&#xff0c;能够自动检测标准的模拟基带电视信号&#xff0c;并将其转变为8位ITU-R.656接口信号或者4:2:2分量视频信…

Leetcode 面试题 17.01 不用加号的加法

设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2 提示&#xff1a; a, b 均可能是负数或 0结果不会溢出 32 位整数 我的答案&#xff1a; 一、信息 1.设计一个函数把两个数相加 2.不得使用或者其他运算符 3.a,b均为负数或…

企业工程项目管理系统源码-专注项目数字化管理-Java工程管理-二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

什么是 Web 应用程序安全测试?

Web 应用程序安全测试是一种严格的实践&#xff0c;旨在识别、分析和纠正基于 Web 的应用程序中的漏洞。 此过程涉及使用一套全面的工具和方法来评估 Web 应用程序的安全性和完整性。它包括渗透测试、漏洞评估和代码审查等实践。 Web 应用程序安全测试的主要目标是阻止潜在的…

C++ Primer阅读笔记--对象移动(右值引用、移动迭代器和引用限定符的使用)

目录 1--右值引用 2--std::move 3--移动构造函数 4--移动赋值运算符 5--移动迭代器 6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用&#xff0c;通过 && 获得右值引用&#xff1b; 右值引用只能绑定到临时对象&#xff08;即将被销毁的对象&#xff09…

[paddle]paddlepaddle官方安装命令合集

官方最新安装命令&#xff1a; https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/windows-pip.html 历史命令&#xff1a; V2.4 环境支持 Python 版本 3.6/3.7/3.8/3.9/3.10 PIP安装方式 Windows 安装 GPU版本支持CUDA 10.2/11.…

数据库建设命名规范

1、数据库库表命名规范 1.1 数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_组成&#xff0c;命名简洁明确&#xff0c;多个单词用下划线_分隔,一个项目一个数据库&#xff0c;多个项目慎用同一个数据库全部小写命名&#xff0c;禁止出现大…

沃尔玛,eBay买家号成号率低如何解决?

eBay是一个很庞大的系统&#xff0c;买家号必须在本土环境才会安全。要想养出高权重的买家号&#xff0c;需要花大量的时间跟精力&#xff0c;一旦养出一批高质量且时间周期较长的买家号&#xff0c;就可以做很多事情&#xff0c;比如可以帮产品上排名&#xff0c;提高产品的权…