string的常用用法详解

article/2025/8/15 12:55:59

一般我们在C语言中用到字符串,都是使用字符数组来存放,但是操作字符数组有时候会不便,所以为了方便操作,在C++的STL中加入了字符串类型(string)。

想要复习以往字符数组的相关知识点请点击以下链接:

字符串的输入输出

字符串操作

字符串的sscanf和sprintf(选看)

如果要使用 string,需要添加 string头文件,即# include<string>  (注意 string. h 和 string 是不一样的头文件)。除此之外,还需要在头文件下面加上一句:“ using namespace std"。

string类型的输入:使用getline;请参考:cin/cout与getline

1.string的定义和初始化:

定义和初始化和普通的数据类型一样:

string str;
str = "abcd";
//或者可以在定义的同时初始化
string str = "abcd";

2.string中内容的访问:

(1)通过下标访问

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

程序代码:

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

运行结果:

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

程序代码:

//cin和cout在iostream头文件中,而不是stdio.h 
#include<iostream>
#include<string>
using namespace std;
int main(){string str;cin>>str;cout<<str<<endl;return 0;
}

运行结果:

对输入的任意字符串,原样输出。

  • scanf和printf来输入输出string的方法——用c_str()将string类型转换为字符数组类型输出。示例如下

程序代码:

#include<cstdio>
#include<string>
using namespace std;
int main(){string str;scanf("%s",str.c_str());	//将str转换为字符数组类型输入 printf("%s\n",str.c_str());		//将str转换为字符数组类型输出 return 0;
}

运行结果:

(2)通过迭代器访问

一般仅通过(1)就可以满足访问的要求,但是有些函数比如insert()和erase()则要求以迭代器为参数,所以还是学一下迭代器的用法。

  • 定义迭代器:
string::iterator it;

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

程序代码:

#include<cstdio>
#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的写法是可行的。

3.string常用函数示例解析:

(1)operator+=

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str1 = "lichuachua",str2 = "aixuexi",str3; str3 = str1+str2;str1+=str2;cout<<str1<<endl;cout<<str3<<endl;return 0;
}

运行结果:

(2)compare operator

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

程序代码:

#include<iostream>
#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(1)。size()基本相同。

程序代码:

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

运行结果:

(4)insert()

insert()常用写法,时间复杂度O(N)。

  • insert(pos,string),在pos号位置插入字符串string。

程序代码:

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

运行结果:

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str = "lichuachua",str1 = "***"; //在str的2号位(即i和第一个c之间)插入 str1 str.insert(str.begin()+2,str1.begin(),str1.end());cout<<str<<endl;return 0;
}

运行结果:

(5)erase()

erase()两种用法:删除单个元素和删除一个区间内的所有元素。时间复杂度O(N)。

  • 删除单个元素。

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str = "lichuachua"; str.erase(str.begin()+1);//删除1号位(从0开始),即 i	  cout<<str<<endl;return 0;
}

运行结果:

  • 删除一个区间内的所有元素。

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str = "lichuachua"; //删除[str.begin()+1,str.end()-3] 内的元素,即ichuac str.erase(str.begin()+1,str.end()-3);	  cout<<str<<endl;return 0;
}

运行结果:

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str = "lichuachua"; str.erase(1,6);	  //从1号位的i开始删除6个cout<<str<<endl;return 0;
}

运行结果:

(6)clear()

clear()用以清空string中的数据,时间复杂度一般我O(1)。

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str = "lichuachua"; cout<<"原字符个数 = "<<str.size()<<endl;str.clear();	//清空字符串 cout<<"现字符个数 = "<<str.length()<<endl;return 0;
}

运行结果:

(7)substr()

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str = "lichuachua ai xuexi"; cout<<str.substr(0,10)<<endl;cout<<str.substr(11,2)<<endl;cout<<str.substr(14,5)<<endl;return 0;
}

运行结果:

(8)string::npos

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){cout<<"UINT_MAX:"<<UINT_MAX<<endl;	//打印unsigned_int类型的最大值if(string::npos == -1) {cout<<"-1 is true "<<endl;}if(string::npos == UINT_MAX) {cout<<"4294967295 is true "<<endl;}if(string::npos == 4294967295) {cout<<"4294967295 is true "<<endl;}return 0;
}

运行结果:

注意:这里每个人有可能不同

(9) find()

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

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

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

程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){string str = "Thank you for your smile"; string str1 = "you"; string str2 = "me";if(str.find(str1) != string::npos) {cout<<str.find(str1)<<endl;}if(str.find(str1,7) != string::npos) {cout<<str.find(str1,7)<<endl;}if(str.find(str2) != string::npos) {cout<<str.find(str2)<<endl;}else {cout<<"不存在"<<endl;}return 0;
}

运行结果:


 

(10)replace()

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

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

时间复杂度为O( str.length)。

程序代码:

#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;
}

运行结果:


http://chatgpt.dhexx.cn/article/m7SjuyeF.shtml

相关文章

对于String的用法详解

目录 一、String的基本用法 二、对于字符串常量池的理解。 三、String类的常见操作。 四、StringBuffer和StringBuilder的使用。 一、String的基本用法 1.1String的创建方法 //第一种创建方法 String str"Hellow"; System.out.println(str);//第二种创建方法 S…

String类的常见用法

目录 1、创建字符串的四种方式&#xff1a;(方式一和方式四最常用&#xff09; 2、字符串的字面量&#xff08;也是字符串的对象&#xff09; 3、字符串比较 4、关于字符串的常量池问题 5、手工入池—String 类提供的 intern 方法 6、字符串的不可变性&#xff1a; 7、修…

非抢占式多级反馈队列优先级调度算法 C++实现

介绍 前段时间比较忙&#xff0c;没有更新&#xff0c;这次的也是操作系统的一个实践作业 C实现非抢占式多级反馈队列优先级调度算法&#xff0c;希望可以帮到你们。 问题介绍 这里我用课件里的内容 1.应设置多个就绪队列&#xff0c;并为每个队列赋予不同的优先级。第一个队…

多级反馈队列算法补充

http://pages.cs.wisc.edu/~remzi/OSTEP/cpu-sched-mlfq.pdf 本文是多级反馈队列&#xff08;multi-level feedback queue&#xff0c;MLFQ&#xff09;算法的一些小补充&#xff08;两个缺陷与修改方法&#xff09;&#xff0c;参考了上面链接。因为自己用中文没有搜到想要的…

操作系统-多级反馈队列

概述 1962年&#xff0c;Corbato首次提出多级反馈队列&#xff0c;应用于兼容时分共享系统(CTSS)。Corbato因在CTSS中的贡献和后来在Multics中的贡献&#xff0c;获得了ACM颁发的图灵奖(Turing Award)。该调度程序经过多年的一系列优化&#xff0c;出现在许多现代操作系统中。 …

操作系统学习(二):浅析多级反馈队列MLFQ

目录 0、引言 1、多级反馈队列&#xff08;MLFQ&#xff09;的基本规则 2、MLFQ的规则具体说明 3、MLFQ调优及其他问题 4、总结 0、引言 在上篇文章操作系统学习&#xff08;一&#xff09;&#xff1a;浅析操作系统进程调度算法中讲到&#xff0c;在一个通用的操作系统中…

多级反馈队列调度算法(附Python3实现代码)

一、多级反馈队列调度算法 多级反馈队列调度算法是进程调度的一种算法&#xff0c;该调度算法可以不用事先知道各种进程所需的执行时间&#xff0c;还可以较好的满足各种类型进程的需要&#xff0c;是目前共认的一种较好的进程调度算法。 那你可能马上就要问了&#xff0c;多…

调度:多级反馈队列

多级反馈队列&#xff08;Multi-level Feedback Queue, MLFQ&#xff09;是有Corbato在1962年提出的&#xff0c;用于兼容时分共享系统。现在其经过多年的优化&#xff0c;已经被应用于很多现代操作系统中。多级反馈队列是为了解决两方面问题。一&#xff1a;优化周转时间。在之…

多级队列调度和多级反馈队列调度算法的实现

多级队列调度算法 操作系统实验导航 实验一&#xff1a;银行家算法 https://blog.csdn.net/weixin_46291251/article/details/115384510 实验二&#xff1a;多级队列调度和多级反馈队列调度算法 https://blog.csdn.net/weixin_46291251/article/details/115530582 实验三&…

多级反馈队列调度算法模拟实现

实验一 多级反馈队列调度算法 一. 主要实现方法和代码介绍 ​ 1.编写进程类,其只包含所需的运行时间和进程编号两个属性,还有一个运行方法,此方法就是将所需的运行时间属性减去.传入的运行时间. ​ 2.创建进程函数:创建maxp个进程,(应该不超过10,在此创建九个,即暂时不进行进…

计操实验 多级反馈队列C语言

计操实验 多级反馈队列C语言 需求&#xff1a; 1.队列4级&#xff0c;每一级的队列长度均为10&#xff1b;第一级的时间片为T&#xff0c;第二级的时间片为2T&#xff0c;第三级的时间片为4T&#xff0c;第四级的时间片为8T&#xff1b;&#xff08;T的大小自己定&#xff09; …

【操作系统】轮转和多级反馈队列

随着计算机的技术逐渐步入家用后&#xff0c;新的调度指标接踵而来&#xff0c;周转时间已经不能满足人们日常工作的需求&#xff0c;更多时候人们更希望计算机能有更好的交互性&#xff0c;使其能更快地去响应任务&#xff0c;由此针对优化响应时间的调度策略也遍地开花&#…

多级反馈队列调度算法(c++)

如果对你有帮助&#xff0c;可以给卑微的博主留个赞、关注、收藏 (不是) (骗一下数据&#xff0c;说不定以后面试就过了&#xff0c;拜谢) 操作系统基本调度算法&#xff0c;多级反馈队列调度算法。在划分时间片的调度算法中&#xff0c;多级反馈队列算法兼顾提高系统吞吐…

多级反馈队列调度算法

实验目的&#xff1a; 在Linux下编程实现多级反馈队列调度算法&#xff0c;采用三级调度策略&#xff0c;所有进程先按到达顺序进入一级队列&#xff0c;按照时间片为2轮转一次&#xff0c;一个时间片内未完成的进程被依次移入二队列尾部。当一级队列中没有进程时&#xff0c;开…

多级反馈队列调度

多级反馈队列 ​ 多级反馈队列&#xff08;Multi-level Feedback Queue&#xff0c; MLFQ&#xff09;&#xff0c;与上个世纪70年代提出&#xff0c;主要应用于时分共享系统。主要解决两方面问题&#xff1a;一个是优化周转时间&#xff0c;一个是要给用户很好的交互体验。ML…

多级反馈队列算法

步骤&#xff1a; 0时刻&#xff0c;P1到达就绪队列&#xff08;时间片为4的&#xff09;P1先执行2ms&#xff0c;P2到达还未到时间片&#xff0c;P1继续执行2ms后&#xff0c;时间片到达了&#xff0c;P1滑到下一个就绪队列&#xff08;时间片为6的&#xff09;此时&#xff…

linux多级反馈队列的实现,多级反馈队列调度算法详解

通常在使用多级队列调度算法时&#xff0c;进程进入系统时被永久地分配到某个队列。例如&#xff0c;如果前台和后台进程分别具有单独队列&#xff0c;那么进程并不从一个队列移到另一个队列&#xff0c;这是因为进程不会改变前台或后台的性质。这种设置的优点是调度开销低&…

对数线性模型

http://blog.csdn.net/pipisorry/article/details/52788947 特征和指示特征 对数线性模型log linear model 对数线性模型有&#xff1a;最大熵模型和逻辑斯谛回归。 [概率图模型原理与技术] [PGM&#xff1a;无向图模型&#xff1a;马尔可夫网 ] 皮皮blog 最大熵模型的一般形式…

广义线性模型(Generalized Linear Model)之三:Poisson回归

广义线性模型&#xff08;Generalized Linear Model&#xff09;之三&#xff1a;Poisson回归 一、泊松回归&#xff08;Poisson regression&#xff09;简介&#xff08;一&#xff09;泊松回归&#xff08;二&#xff09;计数数据&#xff08;三&#xff09;泊松分布1&#x…

MIT自然语言处理第五讲:最大熵和对数线性模型

MIT自然语言处理第五讲&#xff1a;最大熵和对数线性模型&#xff08;第一部分&#xff09; 自然语言处理&#xff1a;最大熵和对数线性模型 Natural Language Processing: Maximum Entropy and Log-linear Models 作者&#xff1a;Regina Barzilay&#xff08;MIT,EECS Depar…