C++| STL之string

前言:最近在做LeetCode算法题,C++字符串通常都是string作为输入,所以补充一下STL里面string。在介绍的具体使用的时候,会补充char字符串相关的进行对比。

string

  • 创建
  • 大小和容量
  • 遍历
  • 字符串比较
  • 插入字符
  • 拼接字符串
  • 分配内存
  • 查找
  • 截取
  • 分割
  • 清空
  • string互转char*

创建

string s1;
string s2 (3,'a');// aaa
string s3 ("value");// value
string s4 (s3);// value
string s5 = "hello!";// hello!

大小和容量

string特有的函数

  • size()和length():返回string对象的字符个数,他们执行效果相同。
  • max_size():返回string对象最多包含的字符数,超出会抛出length_error异常。
  • capacity():重新分配内存之前,string对象能包含的最大字符数。

注意:max_size()是当前分配可容纳字符数,size()是已经使用的,例如下面代码。

string s = "abc"; 
s.reserve(20); 
cout << s.size() << endl;  // 3
cout << s.max_size() << endl;  // 31因为string内存分配按照(n*16-1)分配,能满足20大小的n=2

通用的函数

  • sizeof():返回占用内存的多少。返回的是数组在内存中占用的字节数,字符串数组会包含结束符。
  • strlen():只能用char* 做参数,而且必须以’\0’结尾的,但不计算后面的’\0’。对比,sizeof是运算符,strlen是函数。

效果对比

string s = "abcd";
cout << sizeof(s) << endl;  //16,string每个字符占内存大小和char不同
cout << sizeof("abcd") << endl;  //5 
cout << s.length() << endl; //4
cout << s.size() << endl; //4,s.length()和s.size()功能一样
cout << strlen("abcd") << endl; //4,不计算后面的’\0’

常用:size()、length()、sizeof()。

遍历

string和vector比较相似,都是不定长,vector的操作基本都可以用于string,所以也能像vector那样遍历string里面的字符。

string s = "hello!";// hello!
for(int i=0;i<s.size();i++)cout<<s[i]<<endl

字符串比较

  1. 关系运算符
string s1("abcd");
string s2("abcd");
if(str1 == str2)cout<<"str1 = str2"<<endl;
  1. compare函数
// 比较的字典序,每个字符逐个对比,越小越靠前,例如abc比abd小,hello比hellow小,因为hello比完了hellow还有个w
string s1="hello";
string s2="hellow";int a=s1.compare(s2);// s1等于s2返回0,s1小于s2返回-1,s1大于s2返回1
cout<<a<<endl;// -1int b=s1.compare(2,3,s2);// s1下标为2的字符开始的3个字符llo和s2进行比较
cout<<b<<endl;// 1int c=s1.compare(2,3,s2,1,3);// s1下标为2的字符开始的3个字符llo和s2下标为1的字符开始的3个字符ell比较
cout<<c<<endl;// 1
  1. 遍历:全部遍历按照自己的规则一一对比,前面提过遍历了。

插入字符

函数:

  • push_back(char):尾插一个字符char。
  • insert(pos,char):在制定的位置pos前插入字符char。

测试代码:

string s;
// 尾插一个字符
s.push_back('a');
s.push_back('b');
s.push_back('c');
cout<<"s:"<<s<<endl; // s:abc// 指定位置插入
s.insert(s.begin(),'a');
cout<<"s insert:"<<s1<<endl; // s insert:aabc

拼接字符串

方法:

  • 运算符:str+=str1。
  • append(str)

测试代码:

string s="hello";
string s1=" world";
s.append(s1);// hello world
// s+=s1;// 可替换

分配内存

函数:

  • reserve():为容器预留足够的空间,避免不必要的重复分配,减少系统开销,影响capacity。
  • resize():调整容器中有效数据区域的尺寸,如果尺寸变小,多余的截掉;若尺寸变大,第二个参数填充,影响size。

疑问:看到这两个概念的时候,会想resize有点用,可以截断string,但是reserve似乎没必要。因为string不是不定长吗,看可以不断push_back,不需要预先分配足够的空间啊。
解答:这个和string的运行机制有关,实际上每个string声明和使用的时候都会预先分配好一个容量capacity,如果不定长添加给string后总容量超过了capacity,系统会重新malloc一块连续长度足够的内存,然后把数据都复制到新的位置,再把原先的内存还给系统。如果能预先知道需要多少空间,可以提前reserve,这样能够避免系统开销,提高运行效率。

查找

查找函数find:

  • str.find(str1,pos):在str字符串中找到str1子串的首位置pos,找不到内容则字符串搜索函数返回npos.

截取

截取函数substr:

  • str.substr(pos,count):截取str字符串pos位置开始,count长度的子串。

分割

stirng:并没有通用的函数,得自己根据其它功能的函数实现。

  • string流:用string流中的getline函数,关于stream流相关的内容,我在博客C++| excel存取开头有介绍。
  • find和substr函数组合:每次find到分隔符位置,就截取一部分。

string流代码实现string分割:

string str= "hello world";
istringstream iss(str);	// 输入流
string token;			// 接收缓冲区
char split=' ';
while (getline(iss, token, split))	// 以split为分隔符
{cout << token << endl; // 输出
}
// 结果:
// hello
// world

find和substr函数实现string分割:

string str= "hello world";
char split=' ';
str+=split;// 末尾也加入分隔符
size_t pos=str.find(split);// size_t表示C中任何对象所能达到的最大长度,无符号整数
while(pos!=str.npos)// 找不到内容则字符串搜索函数返回npos
{string temp = str.substr(0, pos);cout << temp << endl; // 输出str=str.substr(pos + 1, str.size());pos = str.find(split);
}
// 结果:
// hello
// world

char:

  • strtok(sign):sign指定分割符,根据sign来分割字符串。
char str[] = "hello world!";
const char *split = " !";// 空格和感叹号
char *p = strtok(str,split);
while( p2 != NULL )
{cout<<p<<endl;p = strtok(NULL,split);
}
// 结果
// hello
// world

对比起来,似乎char的方法方便多了,可以string转char,下一部分会详细介绍。

注意:分割符如果是转义字符得转移符号“\”。

清空

方法:

  • clear函数:
string str = "abcde";
str .clear();
  • 直接赋空字符串:
string str = "abcde";
str = "";//给字符串赋空串来清空

string互转char*

string转char*:

  • c_str():返回一个以’\0’结尾的字符数组。
  • data():仅返回字符串内容,而不含有结束符’\0’。
  • 遍历一个个位置赋值。
char ch1[20],ch2[20];
string s="123456";
strcpy(ch1,s.c_str());
strcpy(ch2,s.data());

char*转string:直接赋值。

string s;
char* p ="hello";
s = p;

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

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

相关文章

Java 注入的几种方式

构造函数注入&#xff1a;构造函数注入是最常见的一种依赖注入方式。通过在组件的构造函数中接受依赖参数&#xff0c;并将其保存在私有字段中&#xff0c;可以实现依赖注入。这种方式简单直接&#xff0c;适用于必须的依赖和不变的依赖场景。 public class UserserviceImpl im…

vue学习笔记(购物车小案例)

用一个简单的购物车demo来回顾一下其中需要注意的细节。 先看一下最终效果 功能&#xff1a; &#xff08;1&#xff09;全选按钮和下面的商品项的选中状态同步&#xff0c;当下面的商品全部选中时&#xff0c;全选勾选&#xff0c;反之&#xff0c;则不勾选。 &#xff08…

51单片机嵌入式开发:2、STC89C52操作GPIO口LED灯

STC89C52操作GPIO口LED灯 1 芯片介绍1.1 芯片类型1.2 芯片系列说明 2 GPIO引脚寄存器说明3 GPIO操作3.1 GPIO输入3.2 GPIO输出3.3 GPIO流水灯3.4 Protues仿真 4 总结 1 芯片介绍 1.1 芯片类型 芯片采用宏晶科技品牌下的STC89C52RC单片机 选择STC89C52RC系列STC89C58RD系列单片…

Pycharm远程连接GPU(内容:下载安装Pycharm、GPU租借、配置SSH、将代码同步到镜像、命令行操控远程镜像、配置远程GPU解释器)

目录 windows下载安装pycharmGPU租借网站AutoDlfeaturize好易智算 GPU租借GPU选择选择镜像充值 然后创建镜像创建成功 复制SSH登录信息 远程进入镜像 在Pycharm中进行ssh连接新建SFTP配置SSH复制ssh根据复制的信息填写ssh配置测试连接 将代码同步到远程镜像上设置mappings将本地…

大语言模型与知识图谱结合发展方向

引言 在人工智能的发展历程中&#xff0c;大语言模型&#xff08;LLM&#xff09;的出现标志着一个重要的转折点。随着深度学习技术的突破和计算能力的提升&#xff0c;LLM以其前所未有的规模和复杂性&#xff0c;开启了迈向人工通用智能&#xff08;AGI&#xff09;的新浪潮。…

STM32利用FreeRTOS实现4个led灯同时以不同的频率闪烁

在没有接触到FreeRTOS时&#xff0c;也没有想过同时叫两个或两个以上的led灯闪烁的想法&#xff0c;接触后&#xff0c;发现如果想叫两个灯同时以不同的频率闪烁&#xff0c;不能说是不可能&#xff0c;就算是做到了也要非常的麻烦。但是学习了FreeRTOS后&#xff0c;发现要想同…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…

(杂文)参加WAIC 2024 所思所感

受华为广办的邀请&#xff0c;在领导要求下&#xff0c; 我还是在这个炎热的暑假通过一个接近凌晨两点落地的飞机连夜从北京来到了上海&#xff0c;去“睁眼看世界”。 区别于纯学术会议和CCF类的会议&#xff0c;WAIC 更加的平易近人&#xff0c;有更多的工业界同行&#xff…

【学术会议征稿】2024年工业自动化与机器人国际学术会议(IAR 2024)

2024年工业自动化与机器人国际学术会议&#xff08;IAR 2024&#xff09; 2024 International Conference on Industrial Automation and Robotics 2024年工业自动化与机器人国际学术会议&#xff08;IAR 2024&#xff09;将于2024年10月18-20日在新加坡隆重召开。会议将围绕…

三丰云评测:免费虚拟主机与免费云服务器的全面对比

三丰云是一家知名的互联网服务提供商&#xff0c;专注于虚拟主机和云服务器的服务。在互联网技术日新月异的今天&#xff0c;选择一个优质的云服务提供商至关重要。本次评测将重点对比三丰云的免费虚拟主机和免费云服务器&#xff0c;帮助用户更好地选择适合自己需求的服务。首…

0 TMS320F28379D 开坑

开坑原因 最近开始做实验&#xff0c;实验室的主控采用的是F2812FPGA&#xff0c;属于够用但不好用的状态。FPGA用于生成调制信号&#xff0c;DSP完成采样和控制。师兄师姐研究拓扑及调制策略&#xff0c;对驱动数量以及驱动逻辑有比较高的要求&#xff0c;因此不好脱离FPGA&a…

CVE-2023-30212(xss漏洞)

简介 OURPHP版本<7.2.0存在XSS漏洞&#xff0c;攻击路径为/client/manage/ourphp_out.php。 过程 打开靶场 访问攻击路径/client/manage/ourphp_out.php 得到flag{354c7c41-cc23-4de5-be73-79cbbf384aba}

Multisim仿真-交流数字电压表

下图为整体的原理框图&#xff0c;交流电源经过整流滤波电路转换后&#xff0c;送入模数转换电路&#xff0c;经译码给到显示电路&#xff0c;由其显示交流电源的有效值。 信号发生器XFG1输出正弦波信号(峰峰值)&#xff0c;XMM1测量有效值&#xff0c;U6数码管显示有效值。仿真…

Linux下python抓取动态网页内容

一、背景 现在大部分网站的数据都是异步加载的&#xff0c;直接抓取是没办法获取到你想要的数据。必须要借助浏览器(无头浏览器,下面会搭建这个环境)来加载其javascript渲染数据后&#xff0c;你所需要的数据这时才呈现。 二、环境搭建 1、Centos7 默认有 python2.7版本 查…

[BJDCTF 2nd]简单注入

sqlsqlsqlsqlsql又来喽 过滤了单双引号&#xff0c;等于符号&#xff0c;还有select等&#xff0c;但是这里没有二次注入 。扫描发现hint.txt 看出题人的意思是&#xff0c;得到密码即可获得flag。 select * from users where username$_POST["username"] and passw…

二叉树的顺序存储

目录 顺序存储&#xff1a; 简介&#xff1a; 节点的位置关系&#xff1a; 优缺点&#xff1a; 优点&#xff1a; 缺点&#xff1a; 二叉树顺序存储的模拟实现&#xff1a; 向上调整算法&#xff1a; 向下调整算法&#xff1a; 二叉树的初始化&#xff1a; 直接初始化…

spdlog一个非常好用的C++日志库(五): 源码分析之registry类

目录 1.registry类意义 2.registry类实现 2.1.registry数据成员 2.2.registry函数成员 2.2.1.构造与析构 2.2.2.单例模式 2.2.3.全局注册表 2.2.4.initialize_logger初始化logger对象 2.2.5.全局格式器 2.2.6.预置日志等级 2.2.7.flush日志等级 2.2.8.默认logger …

合并区间(python3)

合并区间 题目描述解题思路代码实现复杂度 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示…

认识流式处理框架Apache Flink

目录 一、Apache Flink 的基础概念 1.1 Apache Flink是什么&#xff1f; 1.2 Flink的定义 二、Apache Flink 的发展史 2.1 Flink前身Stratosphere 2.2 Flink发展时间线及重大变更 三、Flink核心特性 3.1 批流一体化 3.2 同时支持高吞吐、低延迟、高性能 3.3 支持事件时…

Git 运用小知识

1.Git添加未完善代码的解决方法 1.1 Git只是提交未推送 把未完善的代码提交到本地仓库 只需点击撤销提交&#xff0c;提交的未完善代码会被撤回 代码显示未提交状态 1.2 Git提交并推送 把未完善的代码提交并推送到远程仓库 点击【未完善提交并推送】的结点选择还原提交&#x…