【C++】string基本用法(常用接口介绍)

文章目录

  • 一、string介绍
  • 二、string类对象的创建(常见构造)
  • 三、string类对象的容量操作
    • 1.size()和length()
    • 2.capacity()
    • 3.empty()
    • 4.clear()
    • 5.reserve()
    • 6.resize()
  • 四、string类对象的遍历与访问
    • 1.operator[ ]
    • 2.正向迭代器begin()和end()
    • 3.反向迭代器rbegin()和rend()
    • 4.const正向和反向迭代器
    • 5.范围for
    • 6.at()
  • 五、string类对象的查找与修改
    • 字符串查找
      • 1.find()与npos
      • 2.rfind()
      • 3.find_first_of()和find_last_of()
      • 4.substr()
    • 字符串修改
      • 1.operator+=
      • 2.push_back()与pop_back()
      • 3.append()
      • 4.insert()
      • 5.erase()
      • 6.replace()
  • 六、string类非成员函数
    • operator+
    • 输入getline

一、string介绍

string是表示字符串的字符串。它提供了一系列成员函数和操作符,使得字符串的操作更加方便和灵活。它位于标准命名空间std下,因此通常需要使用using namespace std;语句或者前缀std::来引用。

string是C++的STL(standard template libaray-标准模板库)的容器之一。本篇,我们主要介绍string的基本用法。所有接口用法都可以在cplusplus参考手册中查阅。下面我们主要介绍string的一些常用接口。

string底层实际是basic_string类模板的实例化,是表示字符串类型的模板类
在这里插入图片描述

二、string类对象的创建(常见构造)

在这里插入图片描述string重载了很多构造和拷贝构造函数,其实常用的也就4种。

//常用构造方式
string s1;//无参构造
string s2("interesting");//构造
string s3(s2);//拷贝构造
string s4 = "hello world";//构造

不常用的初始化方式

//函数原型 string (size_t n, char c);
string s5(10, 'x');//10个字符x
//函数原型 string (const string& str, size_t pos, size_t len = npos);
string s6(s2, 8, 3);//打印ing 第8个位置开始拷贝3个字符 
string s7(s2, 8);//打印ing 第8个位置开始拷贝后面所有字符

三、string类对象的容量操作

1.size()和length()

计算有效字符串长度,不包括\0 size()与length()的底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

int main()
{string s("abcde");cout << s.size() << endl;//5cout << s.length() << endl;//5return 0;
}

2.capacity()

返回string类对象的空间容量大小。同样的一个字符串在不同编译器下的容量可能不一样。

string s("abcde");
cout << s.capacity() << endl;//vs2019:15

3.empty()

字符串为空返回1,非空则返回0。

一般也很少用到。我们也可以用str == ""判断是否为空。

4.clear()

clear()只是将string中有效字符清空,不改变底层空间大小。 即有效数据size()清零,容量capacity()不变。

string s("abcde");
s.clear();

5.reserve()

提前申请空间,可以避免频繁扩容。有效数据size不变,容量capacity增大。 且只比指定容量要大,不会小。
在这里插入图片描述
在Windows环境下(如上图),reserve实际申请空间一般比我们指定的参数要大;而Linux的扩容空间与指定参数一样。

不同环境下,string扩容的规律也不同:Windows环境下(PJ版本STL),容量capacity每次以1.5倍的速度扩容;Linux环境下(SGI版本STL),每次以2倍速度扩容;所以频繁扩容的成本较高。reserve可以提前申请好空间,避免频繁扩容。

在这里插入图片描述

reserve可以缩容吗?

可以,但是如果原始空间有数据,则缩容无效;用clear清空有效数据,即可缩容到指定参数大小的空间。所以,想用reserve缩小空间

6.resize()

调整string容器大小,即有效数据个数size()。

string s("abcde");
s.resize(3);//abc  size=3;
s.resize(5, 'x');//abcxx size=5

n < size相当于尾删,size()减小到n,底层空间capacity()不变。
n > size则size增加到n,多出的空间用第二个字符参数填充,无参则默认填充’\0’。

四、string类对象的遍历与访问

1.operator[ ]

int main()
{string s("interesting");for (size_t i = 0; i < s.size(); i++){cout << s[i];s[i]++;}return 0;
}

2.正向迭代器begin()和end()

begin()返回指向字符串第一个字符的迭代器,end()返回指向字符串末尾字符’\0’的迭代器。

迭代器提供了一种遍历容器中元素的方法,迭代器是像指针一样的类型,但可能是指针,也可能不是指针,用法与指针类似。
任何容器都支持迭代器,并且用法是类似的。 迭代器是属于类域的,所以要加域作用限定符。并且对于迭代器的使用,搭配关键字auto使用更简单。

int main()
{string s("interesting");//auto it = s.begin();//自动识别类型string::iterator it = s.begin();//打印interestingwhile (it != s.end()){cout << *it;it++;}return 0;
}

3.反向迭代器rbegin()和rend()

反向迭代器与正向迭代器用法一样,可以实现逆序遍历。注意正向和反向迭代器名字不一样。

int main()
{string s("interesting");//auto it = s.rbegin();//自动识别类型string::reverse_iterator rit = s.rbegin();//打印gnitseretniwhile (rit != s.rend()){cout << *rit;rit++;}return 0;
}

4.const正向和反向迭代器

对于const修饰的string类对象,就只能用const迭代器,否则会发生权限的放大。

使用auto更方便省事。

const string s("interesting");
//正向
string::const_iterator it = s.begin();
auto it = s.begin();
//反向
string::const_reverse_iterator rit = s.rbegin();
auto it = s.rbegin();

5.范围for

C++11支持更简洁的范围for的新遍历方式。范围for的底层就是迭代器,不支持迭代器就不支持范围for。

int main()
{string s("interesting");for (auto& ch : s)//可读 加上引用可写{ch++;cout << ch;}return 0;
}

6.at()

使用与operator[ ]一样,但一般很少用at()来访问string。
at()与[ ]的区别是对越界的检查不一样:[ ]越界会断言,比较暴力;at()越界会抛异常,比较温和。

int main()
{string s("interesting");for (size_t i = 0; i < s.size(); i++){cout << s.at(i);s.at(i)++;}return 0;
}

五、string类对象的查找与修改

字符串查找

1.find()与npos

find是查找字符或字符串函数,返回与字符参数匹配到的第一个字符位置下标,如果找不到则返回npos。

在这里插入图片描述

npos是string类的静态成员变量,值为-1(-1的补码全是1),因为是size_t即无符号整型,所以npos表示的大小为232-1,即整型的最大范围。
在这里插入图片描述

2.rfind()

与find()一样,只不过rfind()是从右往左查找。
在这里插入图片描述

3.find_first_of()和find_last_of()

find_first_of():只要字符串中找到字符参数中任意一个字符,则返回第一个找到的下标。

例如,下面这段代码将字符串中的aeiou全部替换成*

在这里插入图片描述find_last_of()同理,只不过是从右往左查找。

4.substr()

返回获取到的子串

int main()
{string s1("hello world");//第一种也是最常用的string s2 = s1.substr(2, 3);//截取从下标2开始的3个字符cout << s2 << endl;//llos2 = s1.substr(6);//截取从下标6开始后面的所有字符cout << s2 << endl;//worlds2 = s1.substr();//截取整个字符串cout << s2 << endl;//hello worldreturn 0;
}

字符串修改

1.operator+=

+= 可以尾插字符或者字符串,这个比较常用。+=操作不仅可以连接单个字符,还可以连接字符串。

int main()
{string s("hello ");s += "world";s += '!';cout << s << endl;return 0;
}

2.push_back()与pop_back()

尾插和尾删单个字符

string s("abcd");
s.pop_back();//abc
s.push_back('x');//abcx

3.append()

尾插n个字符或者尾插指定区间的字符串

string s("hello ");
s.append(10, 'x');//尾插10个x
s.append("world", 3);//尾插字符串world的前3个字符
s.append("world", 1, 3);//尾插从下标1开始往后的3字符即orl

tip:一般push_back()和append()尾插不常用,用+=更方便省事。

4.insert()

在指定位置插入字符或者字符串
在这里插入图片描述

5.erase()

删除指定位置的字符或字符串
在这里插入图片描述

6.replace()

用新的字符或者字符串替换原字符串部分字符
在这里插入图片描述

六、string类非成员函数

operator+

尽量少用,因为传值返回,导致深拷贝效率低。

int main()
{string s1("hello");string s2("world");s1 = s1 + " " + s2;cout << s1 << endl;return 0;
}

operator>>和operator<<运算符重载也是string的非成员函数。

输入getline

cin无法读取空格和换行,getline可以弥补这个缺陷。需要包含头文件<string>

不指定分隔符,默认以回车结束,可以读取空格,常用来读取一行。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s;getline(cin, s);cout << s;return 0;
}

第三个参数可以指定分隔符,例如指定’\r’可以读取回车,结束需按下:Ctrl+z 然后再回车

#include <iostream>
#include <string>
using namespace std;
int main()
{string s;getline(cin, s, '\r');cout << s;return 0;
}

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

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

相关文章

QTableView与QSqlQueryModel的简单使用

测试&#xff1a; 这里有一个sqlite数据库 存储了10万多条数据&#xff0c;col1是1,col2是2. 使用QSqlQueryModel和QTableView来显示这些数据&#xff0c;也非常非常流畅。 QString aFile QString::fromLocal8Bit("E:/桌面/3.db");if (aFile.isEmpty())return;//打…

计算机图形学笔记----矩阵

矩阵和标量的运算 ,则 矩阵与矩阵相乘 的矩阵A&#xff0c;的矩阵B。两矩阵&#xff0c;结果为的矩阵&#xff0c;第一个矩阵的列数必须和第二个矩阵的行数相同&#xff0c;否则不能相乘 &#xff0c;中的每个元素等于A的第i行所对应的矢量和B的第j列所对应的矢量进行矢量点…

云计算【第一阶段(22)】Linux的进程和计划任务管理

目录 一、查看进程 1.1、程序和进程的关系 1.2、查看进程 1.2.1、静态查看进程信息ps ​编辑 1.2.1.1、实验 1.2.2、动态查看进程信息top 1.2.2.1、实验 1.2.2.2、top 命令全屏操作界面快捷键 1.2.3、pgrep根据特定条件查询进程pid信息 1.2.4、pstree命令以树形结构列出…

Avue框架学习

Avue框架学习 我们的项目使用的框架是 Avue 在我看来这个框架最大的特点是可以基于JSON配置页面上的From,Table以及各种各样的输入框等,不需要懂前端就可以很快上手,前提是需要多查一下文档 开发环境搭建 由于我本地的环境全是用docker来搭建的,所以我依然选择用docker搭建我…

万字浅析视频搜索系统中的多模态能力建设

万字浅析视频搜索系统中的多模态能力建设 FesianXu 20240331 at Tencent WeChat search team 前言 视频搜索是天然的富媒体检索场景&#xff0c;视觉信息占据了视频的一大部分信息量&#xff0c;在视频搜索系统中引入多模态能力&#xff0c;对于提高整个系统的能力天花板至关重…

机器人控制系列教程之任务空间运动控制器搭建(1)

任务空间运动控制简介 任务空间运动控制—位置被指定给控制器作为末端执行器的姿态。然后&#xff0c;控制器驱动机器人的关节配置到使末端执行器移动到指定姿态的值。这有时被称为操作空间控制。 任务空间运动模型表示机器人在闭环任务空间位置控制下的运动&#xff0c;可使用…

汽车电子工程师入门系列——AUTOSAR通信服务框架(下)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

python格式文件

python小白考后复习 CSV格式文件ini格式文件我们可以读取所有节点还可以输出一个节点下所有键值对组成的元组获取节点下的键对应的值判断节点是否存在添加节点还可以添加键值还可以删除节点 XML格式文件读取若是文件格式存在的xml若是以字符串形式存在的xml获取子标签还有获取子…

【分布式计算框架 MapReduce】高级编程—搜索日志数据分析

目录 一、对于 sogou_500w_utf 数据&#xff0c;使用 MapReduce 编程模型完成对以下数据的分析任务 1. 统计 2011-12-30 日搜索记录&#xff0c;每个时间段的搜索次数 &#xff08;1&#xff09;运行截图 &#xff08;2&#xff09; 源代码 2. 统计 2011-12-30 日 3 点至 …

2024最新初级会计职称题库来啦!!!

16.根据增值税法律制度的规定&#xff0c;下列各项中&#xff0c;属于"提供加工、修理修配劳务"的是&#xff08;&#xff09;。 A.修理小汽车 B.修缮办公楼 C.爆破 D.矿山穿孔 答案&#xff1a;A 解析&#xff1a;选项AB&#xff1a;修理有形动产&#xff08;…

【PL理论深化】(13) 变量与环境:文法结构 | 真假表达式:isZero E | let 表达式叠放 | 定义的规则 | 条件语句的使用

&#x1f4ac; 写在前面&#xff1a;从现在开始&#xff0c;让我们正式设计和实现编程语言。首先&#xff0c;让我们扩展在之前定义的整数表达式语言&#xff0c;以便可以使用变量和条件表达式。 目录 0x00 文法结构 0x01 真假表达式&#xff1a;isZero E 0x02 let 表达式叠…

Elasticsearch 第四期:搜索和过滤

序 2024年4月&#xff0c;小组计算建设标签平台&#xff0c;使用ES等工具建了一个demo&#xff0c;由于领导变动关系&#xff0c;项目基本夭折。其实这两年也陆陆续续接触和使用过ES&#xff0c;两年前也看过ES的官网&#xff0c;当时刚毕业半年多&#xff0c;由于历史局限性导…

ArtTS系统能力-通知的学习(3.1)

上篇回顾&#xff1a; ArtTS语言基础类库-容器类库内容的学习(2.10.2&#xff09; 本篇内容&#xff1a; ArtTS系统能力-通知的学习&#xff08;3.1&#xff09; 一、 知识储备 1. 基础类型通知 按内容分成四类&#xff1a; 类型描述NOTIFICATION_CONTENT_BASIC_TEXT普通文…

2024 Parallels Desktop for Mac 功能介绍

Parallels Desktop的简介 Parallels Desktop是一款由Parallels公司开发的桌面虚拟化软件&#xff0c;它允许用户在Mac上运行Windows和其他操作系统。通过强大的技术支持&#xff0c;用户无需重新启动电脑即可在Mac上运行Windows应用程序&#xff0c;实现了真正的无缝切换。 二…

普元EOS学习笔记-创建精简应用

前言 本文依旧基于EOS8.3进行描述。 在上一篇文章《EOS8.3精简版安装》中&#xff0c;我们了解到普元预编译好的EOS的精简版压缩包&#xff0c;安装后&#xff0c;只能进行低开&#xff0c;而无法高开。 EOS精简版的高开方式是使用EOS开发工具提供的IDE&#xff0c;创建一个…

东软睿驰总裁兼CTO杜强受邀出席 CICV 2024智能网联汽车技术首脑(CTO)闭门峰会

近日&#xff0c;第十一届国际智能网联汽车技术年会&#xff08;CICV 2024&#xff09;在北京举办&#xff0c;会议期间组织智能网联汽车技术首脑&#xff08;CTO&#xff09;闭门峰会&#xff0c;邀请40余位技术领袖围绕智能网联汽车产业生态建设以及智能网联汽车数据、算力和…

Python的numpy简单使用

1.可以调用引入numpy里面的函数&#xff0c;如add可以把俩数相加&#xff0c;也可以创建一个数组arr&#xff0c;arr.shape是数组arr的属性&#xff0c;如果后有跟&#xff08;&#xff09;就是里面的一个函数 type()函数可以知道里面是什么类型 变量.shape可以知道这个变量是…

基于决策树的旋转机械故障诊断(Python)

前置文章&#xff1a; 将一维机械振动信号构造为训练集和测试集&#xff08;Python&#xff09; https://mp.weixin.qq.com/s/DTKjBo6_WAQ7bUPZEdB1TA 旋转机械振动信号特征提取&#xff08;Python&#xff09; https://mp.weixin.qq.com/s/VwvzTzE-pacxqb9rs8hEVw import…

菲尔兹奖得主测试GPT-4o,经典过河难题未能破解!最强Claude 3.5回答离谱!

目录 01 大言模型能否解决「狼-山羊-卷心菜」经典过河难题&#xff1f; 02 加大难度&#xff1a;100只鸡、1000只鸡如何&#xff1f; 01 大言模型能否解决「狼-山羊-卷心菜」经典过河难题&#xff1f; 最近&#xff0c;菲尔兹奖得主Timothy Gowers分享了他测试GPT-4o的经历&a…

游戏推荐: 植物大战僵尸杂交版

下载地址网上一搜就有. 安装就能玩. 2是显血. 4显示植物血, 5是加速. 都是左手主键盘的按钮, 再按是取消. 比较刺激: ps: 设置里面还能打开自动收集阳光和金币.