STL库--string

目录

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.

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

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

相关文章

据库管理-第196期 实战RDMA(20240528)

数据库管理196期 2024-05-28 数据库管理-第196期 实战RDMA&#xff08;20240528&#xff09;1 环境2 操作系统配置3 配置NVMe over RDMA4 挂载磁盘处理并挂载磁盘&#xff1a; 5 RDMA性能测试6 iSCSI部署7 iSCSI性能测试8 性能对比总结 数据库管理-第196期 实战RDMA&#xff08…

大数据Hadoop之-工具HIVE(一)

大数据Hadoop之——数据仓库Hive HIVE介绍Hive是基于Hadoop的一个数据仓库(Data Aarehouse,简称数仓、DW),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。是用于存储、分析、报告的数据系统。 在Hadoop生态系统中,HDFS用于存储数据,Yarn用于资源管理…

设计模式:装饰模式(Decorator)

设计模式&#xff1a;装饰模式&#xff08;Decorator&#xff09; 设计模式&#xff1a;装饰模式&#xff08;Decorator&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例模式扩展参考 设计…

shell中编写备份数据库脚本(使用mysqldump工具)

mysqldump备份 目录 mysqldump备份 分库备份 分表备份 利用自带工具mysqldump 实现数据库分库分表备份。 要想知道需要备份哪些数据库&#xff0c;就得先列出来 mysql -uroot -pOpenlab123! -N -e show databases | egrep -on_schema|mysql|performance_schema|sys" …

【Mybatis】映射文件中获取参数的类型是集合或数组处理

基本数据类型的参数或者对象作为参数的情况&#xff0c;在Mybatis还有一些特殊处理的参数类型要特别注意&#xff1a;如果参数类型是集合Collection&#xff08;List&#xff0c;Set&#xff09;或者是数组&#xff0c;Mybatis也会把这些类型的参数封装在一个Map对象中传递到xm…

使用Python发送电子邮件

大家好&#xff0c;当我们需要迅速、方便地与他人沟通时&#xff0c;电子邮件是无疑是一种不可或缺的通信工具。无论是在个人生活中还是工作场合&#xff0c;电子邮件都是我们日常生活中的重要组成部分。它不仅能够传递文字信息&#xff0c;还可以发送附件、链接和嵌入式多媒体…

CANDela studio使用小tips

打开软件的时候注意先选择英文&#xff0c;因为双击CDD/CDDT文件默认打开的是德文&#xff0c;所以最正确的打开方式是先打开CANDela studio&#xff0c;再导入CDD&#xff0c;不仅可以避免用德文打开&#xff0c;还能避免vector软件的bug。 不同的版本有不同的权限。 admin有…

uni微信小程序input框过滤中文字节以及规定以外的符号

问题描述 需求是输入账号只能为手机号、邮箱、字母和数字组成的字符串&#xff0c;那么就是所有大小写字母、数字、以及符号 - _ . 四种。 条件限制 微信小程序无法直接通过type属性实现&#xff0c;type属性中没有专门为只允许英文字母的输入类型。详情见input | uni-ap…

【Python】搭建pypi私仓

1. 下载依赖 pip install pypiserver # 命令安装 pypiserver 库 pip install passlib # passlib 包来读取 Apache htpasswd 文件apt-get install -y apache2-utils2. 生成密码 使用htpasswd库在指定路径/path/to/.pypipasswd生成密码文件 htpasswd -c /path/to/.pypipasswd …

数据结构之堆(优先级队列)

前言 在上一章我们讲了二叉树&#xff0c;这一节我们来讲堆&#xff08;优先级队列&#xff09;&#xff0c;所以想知道堆创建&#xff0c;可以看一下二叉树的一些简单概念。http://t.csdnimg.cn/4jUR6http://t.csdnimg.cn/4jUR6 目录 前言 堆 1.概念 2.优先级队列的模拟实…

补环境——A股市场

补环境 吐环境 1.Proxy对象 Proxy对象由两个部分组成&#xff1a;target、handler target:目标对象 handler&#xff1a;是一个对象&#xff0c;声明了代理target的指定行为&#xff0c;支持的拦截操作&#xff0c;一共13种&#xff1a; get(target,propKey,receiver)&…

【全开源】酒店订单管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的旨在为民宿、酒店、宾馆等提供房态、订单、财务、客史等数据化、信息化的智慧管理工具&#xff0c;实现一站式订房管理&#xff0c;帮助酒店、民宿、宾馆提升管理效率&#xff0c;降低管理成本&#xff0c;提升行业竞争力。 打造高效、便捷的酒…

为什么c语言不对0和NULL做严格的区分?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;这个答案很简单:c语言不区分…

ubuntu中idea创建spark项目步骤

1.前置条件 ubuntu中已经安装idea,jdk,scala,spark 2.打开idea&#xff0c;新建&#xff0c;选择Maven项目 3.在IDEA中&#xff0c;File-Setting-Plugin&#xff0c;下载Scala插件 4.File-project structure&#xff0c;导入插件 4.1在全局库中&#xff0c;选择导入刚才的sca…

HTML 页面布局

慢慢生活&#xff0c;慢慢变好 —— 24.5.28 页面布局 盒子: 页面中所有的元素(标签)&#xff0c;都可以看做是一个盒子&#xff0c;由盒子将页面中的元素包含在一个矩形区域内&#xff0c;通过盒子的视角更方便的进行页面布局 盒子模型组成: 内容区域(content)、内边距区域(pa…

什么是知识中台?为什么企业需要知识中台?

如今市面上的企业数不胜数&#xff0c;企业的任何一个小细节都会产生很大的影响。近几年来一直很热门的知识中台备受企业关注。关于如何高效地管理、整合和运用知识&#xff0c;成为了每一家企业都在重点关注的问题。而知识中台&#xff0c;就是为了解决这一问题而诞生的一个全…

鸿蒙开发接口UI界面:【@ohos.router (页面路由)】

页面路由 说明开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。页面路由需要在页面渲染完…

如何在生产环境中以非 Root 用户启动 Kafka

目录 如何在生产环境中以非 Root 用户启动 Kafka1. 创建 Kafka 用户2. 设置目录权限3. 配置 systemd 服务文件4. 启动和启用 Kafka 服务5. 验证 Kafka 服务经验总结 为了在生产环境中以非 root 用户&#xff08;如 kafka 用户&#xff09;启动 Kafka&#xff0c;您需要确保 Ka…

Unity之如何使用Localization来实现文本+资源多语言

前言 使用Unity实现本地化&#xff08;Localization&#xff09;功能 在当今的游戏开发中&#xff0c;支持多语言已成为一项基本需求。Unity作为主流的游戏开发引擎&#xff0c;提供了强大的本地化工具&#xff0c;使开发者能够方便地为游戏添加多语言支持。本文将介绍如何在U…

Linux 防火墙 firewalld 常用命令

1 防火墙 - firewalld 1.1 开启防火墙 # 临时性开启&#xff0c;服务器重启后会恢复为原来的状态 systemctl start firewalld # 永久性开启&#xff08;即开机启动&#xff09;&#xff0c;重启服务器后生效 systemctl enable firewalld1.2 关闭防火墙 # 临时性关闭&#xf…