当前位置: 首页 > news >正文

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,下一部分会详细介绍。

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

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;

相关文章:

C++| STL之string

前言&#xff1a;最近在做LeetCode算法题&#xff0c;C字符串通常都是string作为输入&#xff0c;所以补充一下STL里面string。在介绍的具体使用的时候&#xff0c;会补充char字符串相关的进行对比。 string 创建大小和容量遍历字符串比较插入字符拼接字符串分配内存查找截取分…...

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式4599张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4599 标注数量(xml文件个数)&#xff1a;4599 标注数量(txt文件个数)&#xff1a;4599 标注…...

JAVA实现麦克风说话同声传译

一、能力与场景说明 同声传译&#xff0c;又称同步口译或同声翻译&#xff0c;是一种专业的口译形式&#xff0c;指的是在讲话者发言时&#xff0c;口译员几乎同时将讲话内容翻译成目标语言。这种翻译方式通常用于国际会议、高级别政治或商业会谈、研讨会和其他需要即时多语言…...

LabVIEW与PLC通讯方式及比较

LabVIEW与PLC之间的通讯方式多样&#xff0c;包括使用MODBUS协议、OPC&#xff08;OLE for Process Control&#xff09;、Ethernet/IP以及串口通讯等。这些通讯方式各有特点&#xff0c;选择合适的通讯方式可以提高系统的效率和稳定性。以下将详细介绍每种通讯方式的特点、优点…...

2024/6/30 英语每日一段

Years of economic and political turbulence have brought stagnation.“In a world where there is more risk and uncertainty, people become reluctant to voluntarily move jobs and find better jobs,” says Manning. At the same time, businesses have cut back on i…...

Postman接口测试工具的原理及应用详解(五)

本系列文章简介&#xff1a; 在当今软件开发的世界中&#xff0c;接口测试作为保证软件质量的重要一环&#xff0c;其重要性不言而喻。随着前后端分离开发模式的普及&#xff0c;接口测试已成为连接前后端开发的桥梁&#xff0c;确保前后端之间的数据交互准确无误。在这样的背景…...

208.贪心算法:买卖股票的最佳时机||(力扣)

代码解决 class Solution { public:int maxProfit(vector<int>& prices) {int result 0; // 初始化结果为0&#xff0c;表示初始利润为0// 从第二天开始遍历价格数组for (int i 1; i < prices.size(); i) {// 如果当天价格比前一天价格高&#xff0c;则将差价加…...

【论文阅读】伸缩密度比估计:Telescoping Density-Ratio Estimation

文章目录 一、文章概览&#xff08;一&#xff09;问题提出&#xff08;二&#xff09;文章工作 二、判别比估计和密度鸿沟问题三、伸缩密度比估计&#xff08;一&#xff09;核心思想&#xff08;二&#xff09;路标创建&#xff08;三&#xff09;桥梁构建&#xff08;四&…...

MongoDB数据库 MQL (MongoDB Query Language)语句大全

基本命令 连接到 MongoDB mongo显示所有数据库 show dbs选择&#xff08;或创建&#xff09;数据库 db集合操作 显示当前数据库中的所有集合 show collections创建集合 db.createCollection("myCollection")删除集合 db.myCollection.drop()文档操作 插入文…...

Java代码基础算法练习-计算平均身高-2024.07.02

任务描述&#xff1a; n个同学站成一排&#xff0c;求它们的平均身高 解决思路&#xff1a; 输入的学生人数为 for 循环次数&#xff0c;循环中每输入一个值就添加在总数中&#xff0c;循环结束总数除以对应的学生人数得到平均身高 代码示例&#xff1a; package a4_2024_07;…...

BIOS设置与系统分区

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…...

linux的安装程序 与 文件 相关的命令

软件安装卸载命令 软件包介绍软件包命名格式dpkg命令apt-get命令apt-get命令 压缩和解压命令 压缩文件后缀 压缩命令打包和解包命令 tar命令 文件分割命令 split命令 文件操作相关命令 cat命令head命令tail命令more命令less命令管道命令wc 命令grep 命令find 命令cut 命令sort …...

SAP_ABAP相关日语单词

基本概念 1. プログラミング言語 (プログラミングげんご, Puroguramingu gengo) - 编程语言 2. 開発 (かいはつ, Kaihatsu) - 开发 3. システム (システム, Shisutemu) - 系统 4. モジュール (モジュール, Mojūru) - 模块 5. トランザクションコード (トランザクションコード,…...

Python中的除法操作详解

在Python编程中&#xff0c;除法是一个基础但极其重要的算术操作。Python提供了多种除法运算方式&#xff0c;以适应不同的计算需求。以下是对Python中除法操作的全面介绍&#xff0c;包括示例代码。 1. 普通除法 / 普通除法使用/运算符&#xff0c;它返回一个浮点数结果&…...

第1章 人工智能的基础概念与应用导论

亲爱的读者朋友们&#xff0c;你们好&#xff01;欢迎来到这个充满神奇与奥秘的人工智能世界。我知道&#xff0c;对于很多人来说&#xff0c;人工智能&#xff08;AI&#xff09;可能是个既神秘又高大上的词汇&#xff0c;仿佛遥不可及&#xff0c;只存在于科幻电影或者顶级科…...

jenkins api部署时,一直提示pending-Finished waiting

问题&#xff1a; 调用jenkins api部署时&#xff0c;一直提示pending-Finished waiting 解决方案&#xff1a; 这个问题困扰了很久&#xff0c;一直没有思路&#xff0c;后面看到调用jenkinsAPI本身会出现一段提示&#xff0c;pending in the quiet period&#xff0c;通过搜…...

AI在创造还是毁掉音乐之论文

AI在创造还是毁掉音乐&#xff1f; 简介&#xff1a;最近一个月&#xff0c;轮番上线的音乐大模型&#xff0c;一举将素人生产音乐的门槛降到了最低&#xff0c;并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后&#xff0c;AI产品的版权归属于谁&#xff0c;创意产业要…...

C++ STL容器:序列式容器-数组string,vector,array,bitset

摘要&#xff1a; CC STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;在C编程中的重要性不容忽视&#xff0c;STL提供了一系列容器、迭代器、算法和函数对象&#xff0c;这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...

ElementUI样式优化:el-input修改样式、el-table 修改表头样式、斑马格样式、修改滚动条样式、

效果图&#xff1a; 1、改变日期时间组件的字体颜色背景 .form-class ::v-deep .el-date-editor { border: 1px solid #326AFF; background: #04308D !important; } .form-class ::v-deep .el-date-editor.el-input__wrapper { box-shadow: 0 0 0 0px #326AFF inset; } // 输入…...

大数据面试题之Spark(6)

Spark输出文件的个数&#xff0c;如何合并小文件? Spark的driver是怎么驱动作业流程的? Spark SQL的劣势? 介绍下Spark Streaming和Structed Streaming Spark为什么比Hadoop速度快? DAG划分Spark源码实现? Spark Streaming的双流join的过程&#xff0c;怎么做的? …...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...