【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;//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.mfbz.cn/a/759966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分治精炼宝库-----快速排序运用(⌯꒪꒫꒪)੭

目录 一.基本概念: 一.颜色分类&#xff1a; 二.排序数组&#xff1a; 三.数组中的第k个最大元素&#xff1a; 解法一&#xff1a;快速选择算法 解法二&#xff1a;简单粗暴优先级队列 四.库存管理Ⅲ&#xff1a; 解法一&#xff1a;快速选择 解法二&#xff1a;简单粗…

linux ls文件排序

linux可以使用ls命令结合一些选项来按照文件大小对文件和目录进行排序。以下是一些常用的方法&#xff1a; 1、这里&#xff0c;-l 选项表示长格式输出&#xff08;包括文件权限、所有者、大小等&#xff09;&#xff0c;-S 选项表示按照文件大小排序&#xff0c;-h 选项表示以…

docker -run hello-world超时

主要原因就是尝试拉取库的时候没有从阿里云镜像里拉&#xff0c;所以设置一下就好了 这里使用的是ubuntu系统&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

MSPM0G3507——定时器例程讲解4——timx_timer_mode_periodic

以下示例以周期模式配置TimerG并切换LED。周期从500ms开始&#xff0c;每次切换减少50ms&#xff0c;直到周期为100ms&#xff0c;然后重复。设备在等待中断时保持待机模式 #include "ti_msp_dl_config.h"/* ((32KHz / (321)) * 0.5s) 45 - 1 495 due to N1 ticks …

FastGPT 调用Qwen 测试Hello world

Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录&#xff0c; 点击右上角的 新建 点击 这里&#xff0c;配置AI使用本地 ollama跑的qwen模型 问题&#xff1a;树上有3只鸟&#xff0c;开了一枪&#…

基于YOLOv9的PCB板缺陷检测

数据集 PCB缺陷检测&#xff0c;我们直接采用北京大学智能机器人开放实验室数据提供的数据集&#xff0c; 共六类缺陷 漏孔、鼠咬、开路、短路、杂散、杂铜 已经对数据进行了数据增强处理&#xff0c;同时按照YOLO格式配置好&#xff0c;数据内容如下 模型训练 ​ 采用YOLO…

Sping源码(九)—— Bean的初始化(非懒加载)— Bean的创建方式(构造器方法)

序言 前面几篇文章介绍了Spring中几种方式下Bean对象的实例化的过程&#xff0c;那如果之前的几种都不满足&#xff0c;按照Spring中正常Bean的实例化步骤&#xff0c;该如何创建这个Bean对象呢&#xff1f; 测试类 我们先创建几个debug中用到的栗子。 Person 以一个平平无…

文章浮现之单细胞VDJ的柱状图

应各位老师的需求复现一篇文章的中的某个图 具体复现图5的整个思路图&#xff0c;这里没有原始数据&#xff0c;所以我使用虚拟生产的metadata进行画图 不废话直接上代码&#xff0c;先上python的代码的结果图 import matplotlib.pyplot as plt import numpy as np# 数据&#…

Linux 交叉编译工具链格式 sqlite3编译示例

1、交叉编译工具链 1.1 定义 交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发工具集&#xff0c;它允许开发者在一个平台上&#xff08;例如高性能的PC或服务器&#xff09;编译生成另一个平台&#xff08;例如嵌入式系统或不同的操作系统和硬件架构&#xff09…

spring boot初始化的几个总结

spring intializr File->New->Project 注意&#xff1a;Spring Initializer中 Java版本选择模块已经不支持1.8了。 Spring Boot 3.x要求 Java最低版本为17&#xff0c; 最新的SpringBoot版本已经要求Java22了 所以&#xff0c;你可以升级Java版本&#xff0c;使用Spri…

自定义指令directive

一、在src目录下创建一个directive文件夹 test.ts文件存放创建的自定义指令&#xff0c;index.ts用于接收所有指令进行统一处理 二、编写自定义指令 // test.ts文件 export default {// 写个自定义指令mounted(el: any, binding: any) {console.log(el, binding, "&qu…

JVM相关总结

JVM的些许问题 1.JVM内存区域划分 2.JVM类加载过程 3.JVM的垃圾回收机制 1.JVM的内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机,需要从操作系统申请一大片内存,就会把内存划分成几个区域,每个区域都有不同的作用 常见的面试题 2.JVM类加载过程 熟练背诵 ! ! !…

Winform使用Flurl调用WebApi的基本用法

微信公众号“CSharp编程大全"的文章《.NET超简单轻量级的HTTP请求组件Flurl》介绍了便捷构建URL及创建HTTP请求的.NET模块Flurl。与HttpClient相比,Flurl封装的更简捷易用&#xff0c;代码量更少。本文学习并测试基于Fluri调用WebApi的基本用法。   基于Fluri调用WebApi…

怎么找python的运行路径

1.命令行中执行&#xff1a; import sys print(sys.argv[0]) 执行后为空。 2. import os os.path.abspath(os.curdir) 3. import os os.getcwd()

LeetCode-213. 打家劫舍 II【数组 动态规划】

LeetCode-213. 打家劫舍 II【数组 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;分三种情况&#xff0c;一&#xff1a;不考虑头尾&#xff1b;二&#xff1a;考虑头不考虑尾&#xff1b;三&#xff1a;考虑尾不考虑头。解题思路二&#xff1a;优化空间解题思路三&am…

如何利用python画出AHP-SWOT的战略四边形(四象限图)

在企业或产业发展的相关论文分析中&#xff0c;常用到AHP-SWOT法进行定量分析&#xff0c;形成判断矩阵后&#xff0c;如何构造整洁的战略四边形是分析的最后一个环节&#xff0c;本文现将相关代码发布如下&#xff1a; import mpl_toolkits.axisartist as axisartist import …

java之命令执行审计思路

1 漏洞原理 因用户输入未过滤或净化不完全&#xff0c;导致Web应用程序接收用户输入&#xff0c;拼接到要执行的系统命令中执行。一旦攻击者可以在目标服务器中执行任意系统命令&#xff0c;就意味着服务器已被非法控制。 2 审计中常用函数 一旦攻击者可以在目标服务器中执行…

【AIGC】AnimateAnyone:AI赋予静态照片生命力的魔法

摘要&#xff1a; 在人工智能技术的不断进步中&#xff0c;AnimateAnyone项目以其创新性和易用性脱颖而出&#xff0c;成为GitHub上备受瞩目的AI项目之一。由阿里巴巴智能计算研究院开发的这一技术&#xff0c;允许用户通过提供一张静态照片&#xff0c;快速生成动态角色。本文…

SpringBoot(一)创建一个简单的SpringBoot工程

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot&#xff08;一&#xff09;创建一个简单的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多环境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…

docker安装rocketMq5x以上的版本

1.背景 安装RocketMQ 5.x以上的版本主要是因为新版本引入了许多性能优化、新功能以及对已有特性的增强&#xff0c;这些改进可以帮助提升消息队列系统的稳定性和效率。 1.性能提升&#xff1a;RocketMQ 5.x版本通常包括了对消息处理速度、吞吐量和延迟的优化&#xff0c;使得系…