STL库--string

news2024/11/18 3:24:12

目录

string的定义

string中内存的访问

string常用函数实例解析

string的定义

定义string的方式跟基本类型相同,只需要在string后跟上变量名即可:

string str;

如果要初始化,可以直接给string类型的变量进行赋值:

string str="abcd";

string中内存的访问

(1)通过下标访问

一般来说,可以直接像字符数组那样来访问string:

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	for(int i=0;i<str.length();i++){
		printf("%c",str[i]);
	}
	return 0;
}

如果要读入和输出整个字符串,则只能用cin和cout

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

上面的代码对任意的字符串输入,都会输出同样的字符串。

那么,其实也可以使用printf来输出string,即用c_str()将string类型转换为字符数组进行输出。

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	printf("%s\n",str.c_str());
	return 0;
}

(2)通过迭代器访问

一般仅通过(1)即可满足访问的要求,但是有些函数比如insert()与erase()则要求以迭代器为参考。

由于string不像其它STL容器那样需要参数,因此可以直接如下定义:

string::iterator it;

这样就得到了迭代器it,并且可以通过*it来访问string里的每一位:

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	for(string::iterator it=str.begin();it!=str.end();it++){
		printf("%c",*it);
	}
	return 0;
}

最后指出,string和vector一样,支持直接对迭代器进行加减某个数字,如str.begin()+3的写法是可行的。

string常用函数实例解析

(1)operator+=

这是string的加法,可以将两个string直接拼接起来

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str1="abc",str2="xyz",str3;
	str3=str1+str2;//将str1和str2拼接起来,赋值给str3
	str1+=str2;//将str2直接拼接到str1上
	cout<<str1<<endl;
	cout<<str3<<endl;
	return 0; 
}

(2)compare operator

两个string类型可以直接使用==、!=、<、<=、>、>=比较大小,比较规则是字典序。

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str1="aa",str2="aaa",str3="abc",str4="xyz";
	if(str1<str2){
		printf("ok1\n");
	}
	if(str1!=str3){
		printf("ok2\n");
	}
	if(str4>=str3){
		printf("ok3\n");
	}
	return 0;
}

(3)length()/size()

length()返回string的长度,即存放的字符数,时间复杂度为O\left ( 1 \right )。size()与length()基本相同。

string str="abcxyz";
printf("%d %d\n",str.length(),str.size());

(4)insert()

string的insert()函数有很多种写法,这里给出几个常用的写法,时间复杂度为O\left ( N \right )

1.insert(pos,string),在pos号位置插入字符串string

string str="abcxyz",str2="opq";
str.insert(3,str2);

输出结果

abcopqxyz

2.insert(it,it2,it3)

it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器,用来表示串[it2,it3)将被插在it的位置上。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcxyz",str2="opq";
	//在str的3号位(即c和x之间)插入str2 
	str.insert(str.begin()+3,str2.begin(),str2.end());
	cout<<str<<endl;
	return 0;
}

(5)erase()

erase()有两种用法:删除单个元素,删除一个区间内的所有元素,时间复杂度均为O\left ( N \right )

1.删除单个元素

str.erase()用于删除单个元素,it为需要删除的元素的迭代器

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcdefg";
	str.erase(str.begin()+4);
	cout<<str<<endl;
	return 0;
} 

输出结果

abcdfg

2.删除一个区间内的所有元素

删除一个区间内的所以元素有两种方法:

str.erase(first,last),其中first为需要删除的区间的起始迭代器,而last则为需要删除的区间的末尾迭代器的下一个地址,也即为删除[first,last)

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcdefg";
	str.erase(str.begin()+2,str.end()-1);
	cout<<str<<endl;
	return 0;
}

输出结果 

abg

str.erase(pos,length),其中pos为需要开始删除的起始位置,length为删除的字符个数。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="abcdefg";
	str.erase(3,2);
	cout<<str<<endl;
	return 0;
}

输出结果

abcfg

(6)clear() 

clear()用以清空string中的数据,时间复杂度一般为O\left ( 1 \right )

#include<stdio.h>
#include<string>
using namespace std;
int main(){
	string str="abcd";
	str.clear();
	printf("%d\n",str.length());
	return 0;
}

(7)substr()

substr(pos,len)返回从pos号位开始,长度为len的子串,时间复杂度为O\left ( len \right )

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="Thank you for your smile.";
	cout<<str.substr(0,5)<<endl;
	cout<<str.substr(14,4)<<endl;
	cout<<str.substr(19,5)<<endl;
	return 0;
} 

输出结果

Thank
your
smile

(8)string::npos

string::npos是一个常数,其本身的值为-1,但由于是unsigned_int类型,因此实际上也可以认为是unsigned_int类型的最大值。string::npos用以作为find函数失配时的返回值。例如在下面的实例中可以认为string::npos等于-1或者4294967295.

#include<iostream>
#include<string>
using namespace std;
int main(){
	if(string::npos==-1){
		cout<<"-1 is true."<<endl;
	}
	if(string::npos==4294967295){
		cout<<"4294967295 is also true."<<endl;
	}
	return 0;
}

输出结果

-1 is true.
4294967295 is also true.

(9)find()

str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,那么返回string::npos

str.find(str2,pos),从str的pos号位开始匹配str2,返回值与上相同。

时间复杂度为O\left ( nm \right ),其中n和m分别是str和str2的长度。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="Thank you for your smile.";
	string str2="you";
	string str3="me";
	if(str.find(str2)!=string::npos){
		cout<<str.find(str2)<<endl;
	}
	if(str.find(str2,7)!=string::npos){
		cout<<str.find(str2,7)<<endl;
	}
	if(str.find(str3)!=string::npos){
		cout<<str.find(str3)<<endl;
	}
	else{
		cout<<"I know there is no position for me."<<endl;
	}
	return 0;
}

输出结果

6
14
I know there is no position for me.

(10)replace()

str.replace(pos,len,str2)把str从pos号位开始,长度为len的子串替换为str2

str.replace(it1,it2,str2)把str的迭代器[it1,it2)范围的子串替换为str2

#include<iostream>
#include<string>
using namespace std;
int main(){
	string str="Maybe you will turn around.";
	string str2="will not";
	string str3="surely";
	cout<<str.replace(10,4,str2)<<endl;
	cout<<str.replace(str.begin(),str.begin()+5,str3)<<endl;
	return 0;
}

输出结果

Maybe you will not turn around.
surely you will not turn around.

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

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

相关文章

Visual Studio 的使用

目录 1. 引言 2. 安装和配置 2.1 系统要求 2.2 安装步骤 2.3 初次配置 3. 界面介绍 3.1 菜单栏和工具栏 3.2 解决方案资源管理器 3.3 编辑器窗口 3.4 输出窗口 3.5 错误列表 3.6 属性窗口 4. 项目管理 4.1 创建新项目 4.2 导入现有项目 4.3 项目属性配置 5. 代…

stm32-DMA转运数据

在配置前要记得先定义一下DMA转运的源端数组和目标数组两个数组哦。 接下来我们就开始准备配置吧 配置 初始化 1.RCC开启时钟&#xff08;开启DMA的时钟&#xff09; void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 作用&#xff1a;开启时…

kafka-生产者发送消息消费者消费消息

文章目录 1、生产者发送消息&消费者消费消息1.1、获取 kafka-console-producer.sh 的帮助信息1.2、生产者发送消息到某个主题1.3、消费主题数据 1、生产者发送消息&消费者消费消息 1.1、获取 kafka-console-producer.sh 的帮助信息 [rootlocalhost ~]# kafka-console…

详解make file中的notdir

在 Makefile 中&#xff0c;$(notdir names…) 是一个函数&#xff0c;用于获取一组文件名或路径中的文件名部分&#xff0c;并将其返回。 这个函数通常用于从给定的路径中提取文件名部分&#xff0c;非常适合在 Makefile 中进行文件处理操作。 语法&#xff1a; makefile C…

基于单片机智能防触电装置的研究与设计

摘 要 &#xff1a; 针对潮湿天气下配电线路附近易发生触电事故等问题 &#xff0c; 对单片机的控制算法进行了研究 &#xff0c; 设 计 了 一 种 基 于 单片机的野外智能防触电装置。 首先建立了该装置的整体结构框架 &#xff0c; 再分别进行硬件设计和软件流程分析 &#xf…

从零开始写 Docker(十六)---容器网络实现(上):为容器插上”网线”

本文为从零开始写 Docker 系列第十六篇&#xff0c;利用 linux 下的 Veth、Bridge、iptables 等等相关技术&#xff0c;构建容器网络模型&#xff0c;为容器插上”网线“。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实…

邀请媒体参会,媒体邀约的正确打开方式

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体参会是一项重要的公关活动&#xff0c;需要细致的规划和执行。以下是一些步骤和建议&#xff0c;可以帮助你更有效地进行媒体邀约&#xff1a; 1. 拟定邀约媒体名单&#xff1a;…

启智CV机器人,ROS

资料&#xff1a; https://wiki.ros.org/kinetic/Installation/Ubuntu https://blog.csdn.net/qq_44339029/article/details/120579608 装VM。 装ubuntu20.04 desktop.iso系统。 装vm工具&#xff1a; sudo apt update sudo dpkg --configure -a sudo apt-get autoremove o…

可燃气体报警器检测周期:如何合理设定以满足安全需求?

可燃气体报警器作为工业安全和生产环境中不可或缺的安全防护设备&#xff0c;其准确性、稳定性和及时响应性对于防止火灾和爆炸事故具有重要意义。 因此&#xff0c;合理设定并严格执行可燃气体报警器的检测周期&#xff0c;是确保安全与可靠运行的核心环节。 一、检测周期的重…

轻兔推荐 —— 一个好用的软件服务推荐平台

给大家推荐一个好用的的软件服务推荐平台&#xff1a;轻兔推荐 网站界面简洁大方&#xff0c;没有太多杂七杂八的功能和页面&#xff0c;有明暗主题色可以选择&#xff0c;默认为亮色&#xff0c;可在网站上方手动切换。 每工作日都会推荐一款软件&#xff0c;有时会加更&…

如何理解Spring Boot自动配置原理和应用?

我们知道&#xff0c;基于Spring Boot&#xff0c;我们只需要在类路径中引入一组第三方框架的starter组件&#xff0c;就能在Spring容器中使用这些框架所提供的各项功能。这在当下的开发过程中已经习以为常&#xff0c;但在Spring Boot还没有诞生之前却是不可想象的。如果我们使…

Dubbo生态之初识分布式事务

1.分布式事务简介 传统的关系型数据库只能保证单个数据库中多个数据表的事务特性。一旦多个SQL操作涉及到多个数据库&#xff0c;这类的事务就无法解决跨库事务问题。在传统架构下&#xff0c;这种问题出现的情况非常少&#xff0c;但是在分布式微服务架构中&#xff0c;分布式…

java方法负载问题

先介绍一下方法的重载 下面是例子 方法名都为sum而形参是不同的 记住&#xff01; 是否为重载关系 1在同一个类里面 2形参不同&#xff08;与返回值无关&#xff09; 3方法名一样 第一个图为什么错&#xff1f; 答案&#xff1a;虽然在同一个类里面&#xff0c;并且方法名…

3-Django项目继续--初识ModelForm

目录 ModelForm 认识ModelForm 优势 初识Form 初识ModelForm 添加信息 views.py add_student_new.html 修改信息 views.py views.py add_student_new.html ModelForm 认识ModelForm 优势 1、方便校验用户提交的数据 2、页面展示错误提示 3、数据库字段很多的情况…

基于Docker的ROS开发

本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS&#xff0c;通过Docker Container运行ROS&#xff0c;可以方便我们在一个本地环境中运行多个ROS版本。 更多内容&#xff0c;访问专栏目录获取实时更新。 关于ROS的版本 参考ROS1 Distribution Wiki和ROS2 Dis…

SpringBoot项目启动时提示程序包不存在和找不到符号

一、前言 最近接手同事开发的一个Springboot工作项目&#xff0c;从svn上整体拉取下来后&#xff0c;构建完成后&#xff0c;启动的时候遇到了程序包找不到的情况&#xff0c;记录一下处理过程&#xff1b; 二、项目问题 1、报错信息&#xff1a;启动后报 java: 程序包org.sp…

最强端侧多模态模型MiniCPM-V 2.5,8B 参数,性能超越 GPT-4V 和 Gemini Pro

前言 近年来&#xff0c;人工智能领域掀起了一股大模型热潮&#xff0c;然而大模型的巨大参数量级和高昂的算力需求&#xff0c;限制了其在端侧设备上的应用。为了打破这一局限&#xff0c;面壁智能推出了 MiniCPM 模型家族&#xff0c;致力于打造高性能、低参数量的端侧模型。…

【Qt秘籍】[004]-Qt中的重要工具-介绍

QtCreator概览 当我们打开系统的菜单翻到刚刚下载的Qt文件&#xff0c;里面的内容却让我们眼花缭乱。 不过别急&#xff0c;下面我们将一一解析。 1.Assistant Qt自带的离线版本官方文档 2.Designer Qt图形化设计界面的工具&#xff0c;通过拖拽控件快速生成界面&#xff0c…

APM 2.8外置罗盘校准

请注意&#xff1a; GPS不可以飞控带电插拔&#xff0c;带电插拔会产生差分电压&#xff0c;可能会导致GPS模块损坏&#xff0c;无法搜星。不听劝告&#xff0c;后果自负&#xff01; 1.如何接线 GPS有两根线&#xff0c;要插上面图所示的两个接口。同时拔掉旁边的跳线帽&…

强化学习——学习笔记2

在上一篇文章中对强化学习进行了基本的概述&#xff0c;在此篇文章中将继续深入强化学习的相关知识。 一、什么是DP、MC、TD&#xff1f; 动态规划法&#xff08;DP&#xff09;&#xff1a;动态规划法离不开一个关键词&#xff0c;拆分 &#xff0c;就是把求解的问题分解成若…