string类的解析【超详细】

.
前言

与C语言不同,string是C++经过封装处理的数据类型,并且是一个C++内部提前被创建的类,使得string具有一般数据类型没有的功能和属性,比如我们可以调用string类里已经定义好的函数,提高写代码的效率。

对string的理解

string本质就是类(可参考上篇博客有对类的详细讲解),用类声明(也可称为创建,实例化)的变量一般被称为对象
string str;这段代码就是创建了一个string类的对象str,因为类也是一种数据结构,所以也可以说是声明了string类型的变量。

https://blog.csdn.net/phantomthief1412/article/details/122174025

string与基本数据类型的区别

1.创建对象时是否初始化:string是经过封装处理的数据类型,它内部的代码已经写好了,若创建对象的时候没有进行初始化,对象就已经被初始化为空字符了(原因可参考上篇博客对类的讲解),当然,也可以用赋值操作符将一个有字符的字符串作为初始值。

2.作用:基本类型只能用来保存值,而类除此之外还有属于自己的功能和属性。

对string的创建并初始化

string str;//初始化为空字符串

string str=字符串;//初始化为指定字符串

string str(字符串);//同上

string str(字符串s,位置p,数量n);//字符串s中从p开始的n个字符组成的新字符串作为str的值

string str(数量n,字符c);//初始化为n个字符c

string内部常用的成员函数

获得对象信息

size()//获取字符串的字符数(string是字节数),返回类型是size_t

length() // 同上

max_size()//获取std.:string可以处理的最大字符数(std:string是字节数),返回类型是size_t

capacity()/获取字符串对象目前的容量,单位是字符,返回类型是size_t

empty()//判断字符串是不是空,返回值类型是bool。

clear() //清空字符串对象(也可以直接赋值空字符串如string=""😉

resize(大小) // 调整字符串对象的大小,多出来的数组空间默认用空字符填充

resize(大小,字符)//调整字符串对象的大小

at()与中括号[]功能一样,但at()在越界访问时抛出异常警报,让程序直接崩溃

对对象赋值

push_back(字符)//在末尾添加一个字符,也可以用"+="

append(字符串)//在末尾添加字符串,也可以用"+="

append(字符串s,开始位置p,数量n)//将字符串s中从p开始的n个字符添加到未尾

append(数量n,字符c)//在末尾添加n个字符c

assign(字符串)//重新赋值

assign(字符串s,开始位置p,数量n)//将字符串s中从p开始的n个字符赋值给字符串对象

assign(数量n,字符c)// 赋值为n个字符c
改变字符串对象的内容

insert(位置p,字符串s)//在位置p插入字符串s

insert(位置p,字符串s,开始位置sp,数量n)//将字符串s中从sp开始的n个字符插入到位置p

insert(位置p,数量n,字符c)//在位置p插入n个字符c

replace(位置p,数量n,字符串s)//字符串中从p开始的n个字符替换为字符串s

replace(位置p,数量n,字符串s,开始位置sp,数量sn)//将字符串s中从p开始的n个字符替换字符串从p开始的n个字符• replace(位置p,数量n,数量sn,字符c)//字符串中从p开始的n个字符替换为sn个字符c

erase(位置p,数量n)//删除字符串中从位置p开始的n个字符

erase(位置p)//删除字符串中从位置p开始的所有字符

erase()// 清空字符串,与clear一样

对对象查找

以下返回类型都是size_t,如果找不到则返回std:string:npos

find(字符C,位置p)//在字符串中从位置p开始向后查找第一次出现字符c的位置

find(字符串s,位置p)//在字符串中从位置p开始向后查找查找第一次出现字符串s的位置

rfind(字符c,位置p)//在字符串中从位置p开始向前查找第一次出现字符c的位置

rfind(字符串s,位置p)//在字符串中从位置p开始向前查找查找第一次出现字符串s的位置

find_first_of(字符c,位置p)//在字符串中从位置p开始向后查找第一次出现字符c的位置

find_first_of(字符串s,位置p)//在字符串中从位置p开始向后查找字符串s中任意一个字符,返回第一次出现的位置

find_last_of(字符C,位置p)//在字符串中从位置p开始向前查找第一次出现字符c的位置

find_last_of(字符串s,位置p)//在字符串中从位置p开始向前查找字符串s中任意一个字符,返回第一次出现的位置

find_first_ not_of(字符C,位置p)//在字符串中从位置p开始向后查找第一个不是字符c的字符的位置

find_first_not_of(字符串s,位置p)//在字符串中从位置p开始向后查找第一个不是字符串s中任意一个字符,返回第一次出现的位置
find_last_not_of(字符c,位置p)//在字符串中从位置p开始向前查找第一个不是字符c的字符的位置

find_last_not_of(字符串s,位置p)//在字符串中从位置p开始向前查找第一个不是字符串s中任意一个字符,返回第一次出现的位置
子字符串

substr(位置p,数量n) // 获取子字符串,即字符串中从位置p开始的n个字符作为新的字符串•substr(位置p) // 获取子字符串,即字符串中从位置p开始到结尾作为新的字符串

substr() // 字符串中从位置开始到结尾作为新的字符串,即复制出一个新的字符串

附加其他头文件对string常用的函数

所需头文件#include<ccpyte.>
isdigit()//判断字符是否为阿拉伯数字

isalpha()//判断是否为字母

islower()//判断是否为小写字母

isupper()//判断是否为大写字母

函数说明:检查参数是否为阿拉伯数字0 到9。 返回值:若参数为阿拉伯数字,则返回true,否则返回null(0)。 附加说明:此为宏定义,非真正函数

所需头文件#include<algorithm.>

count(ivec.begin(), ivec.end(), searchValue) 

//其功能类似于find,这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果。

string在解题中的应用样例展示

题目来源:南方科技大学第四届新生赛题C
在这里插入图片描述
附上译文:

Cknight得到长度N(1<=N<= 500000)的字符串s(1≤N≤500000)。字符串s只能由字符“a”和字符“b”组成。
骑士想把弦弄得一团糟。也就是说,字符串ss不包含字符串“ab”作为它的子字符串。 骑士可以使用几个操作来实现这一点。
在每一个操作中,他可以选择一个位置,并用字符“a”或字符“b”替换对应的字母。 他想知道所需的最小手术数。 输入描述: 一行包含字符串s。
输出描述: 输出答案。 示例 输入:bbbaababa 输出:2 说明
在示例1中,修改位置6和8的字母是一个最优解决方案(假设字符串的索引是1)

用string的解题(这道题其实用string不是最优解)


#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
string s;
int main()
{
	cin >> s;
	int sum = 0;
	int min = count(s.begin(), s.end(), 'b');
	for (size_t i = 0; i <= s.size(); i++)
	{
		int a;
		int b;
		if (i == 0)
		{
			a = 0;
			b = count(s.begin(), s.end(), 'b');
		}
		else if (i == s.size())
		{
			a = count(s.begin(), s.end(), 'a');
			b = 0;
		}
		else
		{
			a = count(s.begin(), s.begin() + i - 1, 'a');
			b = count(s.begin() + i, s.end(), 'b');
		}
		min = a + b < min ? a + b : min;
	}
	cout << min;
	return 0;
}

◆◆◆◆◆◆◆◆◆◆◆◆◆◆感谢您对这篇文章的阅读,感恩一见三连哦~♡◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K.t.P.T.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值