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

news2025/1/20 22:47:44

文章目录

  • 一、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;//5
	cout << s.length() << endl;//5
	return 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();
	//打印interesting
	while (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();
	//打印gnitseretni
	while (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;//llo
	s2 = s1.substr(6);//截取从下标6开始后面的所有字符
	cout << s2 << endl;//world
	s2 = s1.substr();//截取整个字符串
	cout << s2 << endl;//hello world
	return 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.coloradmin.cn/o/1880640.html

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

相关文章

昇思25天学习打卡营第10天 | 基于MindNLP+MusicGen生成自己的个性化音乐

基于MindNLPMusicGen生成自己的个性化音乐 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型&#xff08;LM&#xff09;的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本&#xff0c;相关研究成果参考论文《Simple and Controllable …

Keepalive技术

文章目录 一、Keepalive基础vrrp技术Keepalived介绍Keepalived架构 二、 Keepalived 相关文件配置文件组成全局配置虚拟路由器配置 三、配置lvs和keepalive联动服务器架构抢占模式配置配置单播、组播配置通知模块日志功能脑裂现象 四、keepalived和nginx联动keepalive和其他应用…

html文章卡片

完成效果 中医网站的文本卡片制作&#xff0c;其中用到了grid布局 css基础知识回顾 阴影样式 好的阴影样式可以保存 box-shadow: 6px 6px 5px hsla(0, 0%, 0%, 0.02), 25px 25px 20px hsla(0, 0%, 0%, 0.03), 100px 100px 80px hsla(0, 0%, 0%, 0.05); grid-template-column…

Python的numpy简单使用

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

这些并发编程技术你都知道吗?

与其碌碌无为&#xff0c;不如兴风作浪。 虽然不是所有的系统都需要很多的并发编程技术&#xff0c;但是掌握常见的高并发秘籍&#xff0c;便能让我们的系统快起来&#xff0c;面对访问量的剧增从容应对。 接下来&#xff0c;为我们一起来看看常见的高并发技术有哪些。总结起来…

NAS教程丨铁威马如何登录 SSH终端?

适用型号&#xff1a; 所有TNAS 型号 如您有特殊操作需要通过 SSH 终端登录 TNAS&#xff0c;请参照以下指引&#xff1a; (注意: 关于以下操作步骤中的"cd /"的指令,其作用是使当前 SSH/Telnet 连接的位置切换到根目录,以免造成对卷的占用.请不要遗漏它.) Windows…

Django 对模型创建的两表插入数据

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存储密码first_name …

Excel 数据筛选难题解决

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

leetCode.98. 验证二叉搜索树

leetCode.98. 验证二叉搜索树 题目描述 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(n…

Spring 动态增强逻辑执行分析

1、假如UserService中存在被增强的public 普通方法&#xff0c;那么spring ioc时就会创建对应的代理对象放置到容器中&#xff1b; 2、那么Controller中注入的userService就是代理对象&#xff1b; Service public class UserService {Transactionalpublic void f2(String us…

理解GPT2:无监督学习的多任务语言模型

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据&#xff0c;更大的模型 2、大数据量&#xff0c;大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…

WDG看门狗

1 WDG 1.1 简介 WDG是看门狗定时器&#xff08;Watchdog Timer&#xff09;的缩写&#xff0c;它是一种用于计算机和嵌入式系统中的定时器&#xff0c;用来检测和恢复系统故障。 看门狗就像是一个忠诚的宠物狗&#xff0c;它时刻盯着你的程序&#xff0c;确保它们正常运行。…

WordPress中文网址导航栏主题风格模版HaoWa

模板介绍 WordPress响应式网站中文网址导航栏主题风格模版HaoWa1.3.1源码 HaoWA主题风格除行为主体导航栏目录外&#xff0c;对主题风格需要的小控制模块都开展了敞开式的HTML在线编辑器方式的作用配备&#xff0c;另外预埋出默认设置的编码构造&#xff0c;便捷大伙儿在目前…

python解锁图片相似度的神奇力量

在这个信息爆炸的时代,图片成为了我们传递信息、表达情感和记录生活的重要方式。然而,面对海量的图片资源,如何快速准确地找到相似的图片,成为了一个亟待解决的问题。现在,让我们为您揭开图片相似度的神秘面纱,带您领略这一创新技术的魅力! 图片相似度技术,就像是一位…

一文弄懂DBSCAN聚类算法

1.引言 今天&#xff0c;我们将讨论另一种聚类算法 DBSCAN&#xff08;基于密度的带噪声应用空间聚类&#xff09;。为了更好地理解 DBSCAN&#xff0c;请先阅读之前介绍的 K-Means 和 分层聚类这两篇文章。 顾名思义&#xff0c;DBSCAN 是通过点的密度来识别聚类集群。聚类通…

AI写作变现指南:从项目启动到精通

项目启动 1. 确定目标客户群体 首先&#xff0c;明确谁是我们的目标客户。以下是一些潜在的客户群体&#xff1a; 大学生&#xff1a;他们需要写论文、报告、演讲稿等。 职场人士&#xff1a;包括需要撰写商业计划书、市场分析报告、项目提案等的专业人士。 自媒体从业者&…

《昇思25天学习打卡营第14天 | 昇思MindSpore基于MindNLP+MusicGen生成自己的个性化音乐》

14天 本节学了基于MindNLPMusicGen生成自己的个性化音乐。 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本。 MusicGen模型基于Transformer结构&#xff0c;可以分解为三个不同的阶段…

基于STM32的智能农业环境监控系统

目录 引言环境准备智能农业环境监控系统基础代码实现&#xff1a;实现智能农业环境监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;农业环境管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业环境监控系…

java基础知识点全集

JAVA的所有知识点 一、基础的数组、数据类型、输入输出二、类与对象1. 三大特征&#xff08;1&#xff09; 封装&#xff08;2&#xff09;继承&#xff08;3&#xff09;多态 2. 类的实例化&#xff08;1&#xff09; 类通过NEW来创建&#xff08;2&#xff09; 类的继承&…

Vue3学习(一)

创建组件实例&#xff1a;我们传入 createApp 的对象实际上是一个组件 import { createApp } from vue // 从一个单文件组件中导入根组件 import App from ./App.vueconst app createApp(App) 大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。 App (root compone…