string类(详解)

devtools/2024/10/23 20:44:06/

1.什么是string类

 string是一个C++自己库里面定义的一个类类型,它的内部结构如下。

class STring
{
public:STring(const char* str = "")//默认构造函数{capacity = strlen(str);_str = new char[capacity + 1];size = capacity;strcpy(_str, str);}STring(const STring& s)//拷贝构造函数{delete[]_str;capacity = s.capacity;_str = new char[capacity + 1];size = s.size;strcpy(_str, s._str);}//其它库函数....~STring()//析构函数{free(_str);capacity = 0;size = 0;}
private:char* _str;//指向字符串的指针int capacity;//空间容量int size;//内存大小
};

 它和c语言中的char类型差不多,也是用于定义字符串,但是C++引入string可以更好的对字符串进行操控,使用string必须包含#include头文件以及using namespace std;

2.auto的用法 

auto是类型指示符用来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

 

上述将int 类型的变量赋值给auto类型的  j  ,auto自动识别  i  的类型来定义  j  。 

 1.auto使用注意

 用auto声明指针类型的时候,用auto和auto*没有任何区别

 auto引用类型的时候必须加&

 

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只能对一个类型进行推导,然后用推导出来的类型定义其它变量 

auto不能作为函数参数,但能做返回值,但不建议这样使用。

 

  

auto不能用来声明数组 

3.范围for的用法

 对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错。因此C++中引入了基于范围的for循环。for循环后的括号由冒号:分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

1.for用法示例(看一遍就懂了)

int main()
{int array[5] = { 0,1,2,3,4 };char arr[] = "ABCDEFG";for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++){array[i] = array[i] * 2;}for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++){cout << array[i] << " ";}cout << endl;for (auto i : array){cout << i << " ";}cout << endl;for (auto& j : array){cout << j << " ";}cout << endl;for (auto p : arr){cout << p << " ";}
}

就是自动遍历,不需要和C语言一样需要程序员去判断条件什么的,直接给名字,for就会自动从这个首位置到末尾的位置 

4.string类的常见接口

1.string类对象常见构造

constructor功能说明
string()重点构造空的string类对象,即空字符
string(congst char*s)(重点)用C-string来构造string对象
string(size_t n,char c)string类对象中包含n个字符c
string(const string & s)拷贝构造函数
using namespace std;
int main()
{string st0;string st1("ABCDEFG");string st2(9, 'O');string st3(st1);cout << st0 << endl;cout << st1 << endl;cout << st2 << endl;cout << st3 << endl;}

2.string类对象的容量操作

函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity

返回空间大小

empty(重点)

检测字符串释放为空串,是返回true,否则返回false

clear(重点)清空有效字符
reserve(重点)为字符串预留空间**
resize(重点)将有效字符的个数改成n个,多出的空间用字符c填充

 

注意:

1.size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size() 

2.clear()只是将string中有效字符清空,不改变底层空间的大小。 

3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用'\0'来填充多出的元素空间,resize(size_t n,char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

4.reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。 

 3.string类对象的访问及其遍历操作

函数名称功能说明
operator[](重点)返回pos位置的字符,const string类对象调用
beginbegin获取一个字符的迭代器
endend获取最后一个字符下一个位置的迭代器
rbegin指向最后一个字符
rend指向第一个字符之前的理论元素
范围for上面有介绍,C++支持更简洁的范围for的新遍历方式

注意 

rbegin加1时会往头部进行移动

rend+1时会往尾部进行移动 

#include<iostream>
using namespace std;
int main()
{string st1("ABCDEFGHIJKLM");auto it0 = st1.begin();while (it0!=st1.end()){cout << *it0;it0++;}cout << endl;auto it1 = st1.end();while (it1!=st1.begin()){it1--;cout << *it1;}cout << endl;auto it2 = st1.rbegin();while (it2!=st1.rend()){cout << *it2;it2++;}cout << endl;auto it3 = st1.rend();while (it3!=st1.rbegin()){it3--;cout << *it3;}
}

 4.string类对象的修改操作 

函数名称功能说明
push_back在字符串后尾插一个字符c
append在字符串后追加一个字符串
operator+=(重点)在字符串后追加字符串str
c_str(重点)返回char格式字符串
find(char c,size_t pos = 0)(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind(char c,size_t pos = npos)从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr(size_t pos,size_t pos=npos)在str中从pos位置开始,截取n个字符,然后将其返回
#include<iostream>
using namespace std;
int main()
{string st1("ABCDEFGHIJKLM");st1.push_back('NOPQ');cout << st1 << endl;st1.append("RST");cout << st1 << endl;st1 += "UVW";cout << st1 << endl;char* ch = new char[st1.capacity() + 1];strcpy(ch, st1.c_str());cout << ch << endl;cout << st1.find('B',1)<< endl;cout << st1.rfind('B', 5) << endl;cout << st1.substr(1, 5) << endl;
}

 5.string类非成员函数

函数功能介绍
operator+尽量少用因为传值返回,会导致深拷贝
operator>>(重点)输入运算符重载
operator<<(重点)输出运算符重载
getline获取一行字符串

 

 

 

>>遇到空格停止输入,getline遇到空格也照样输入 


http://www.ppmy.cn/devtools/128245.html

相关文章

Docker 安装Postgres和PostGIS,并制作镜像

1. 查找postgres和postgis现有的镜像和版本号 镜像搜索网站&#xff1a;https://docker.aityp.com/ 测试使用的是postgres:15.4 和 postgis:15-3.4 2、镜像拉取 docker pull postgres:15.4docker pull postgis/postgis:15-3.4镜像下载完成&#xff0c;docker images 查看如…

英雄联盟也裁员了。。。

大家好&#xff0c;我是鸭鸭&#xff01; 想不到裁员的风刮到了《英雄联盟》。 2009 年&#xff0c;《英雄联盟》上线&#xff0c;直至今天它还活跃在网吧屏幕上。 有多少游戏可以经历 15年&#xff1f;对于《英雄联盟》来说&#xff0c;也许用“传奇”这个词更加合适。但如…

蓝桥杯基本操作和运算

文章目录 1.基本运算2.循环--进制转换/最大公约数2.1进制转换2.2求解最大公约数 3.数组与字符串4.常用的API5.快速读写模版 蓝桥杯基本操作和运算 10-22号正式开始准备蓝桥杯的比赛&#xff0c;准备参加这个大学B组的Java的赛项 1.基本运算 首先就是基本的输入输出&#xff1…

线性可分支持向量机的原理推导【补充知识部分】9-11极小极大化问题 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。在主文章中&#xff0c;有一个部分是关于补充拉格朗日对偶性的相关知识&#xff0c;此公式即为这部分里的内容。 公式 9-11 是通过引入拉格朗日乘子法将一个…

python多线程案例——多线程爬取小说

多线程案例——多线程爬取小说 生产者——————产生URL消费者兼生产者——下载小说消费者——————合并小说主函数——————函数入口 注意事项 这里我们使用了队列queue来储存URL&#xff0c;需要提取导入一下队列&#xff0c;我们在主函数中让队列实例化&#xff0…

【C++语言】深入学习C++要修炼的内功

一、进程虚拟地址空间区域划分 我们先来分析以下代码&#xff1a; int gdata1 10; int gdata2 0; int gdata3;static int gdata4 11; static int gdata5 0; static int gdata6;int main() {int a 12;int b 0;int c;static int e 14;static int f 0;static int g;retu…

unity学习笔记-安装与部署

unity学习笔记-安装与部署 unity & visual studio下载unityvisual studio 创建工程项目内的布局介绍初始化项目各目录介绍1. 场景视图&#xff08;Scene&#xff09;2. 游戏视图&#xff08;Game&#xff09;3. 层次结构视图&#xff08;Hierarchy&#xff09;4. 检查器视图…

#每日一题#自动化 2024年10月

#每日一题#自动化 2024年10月 1、深拷贝和浅拷贝的区别是什么&#xff1f; 参考答案&#xff1a; 深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中&#xff0c;我们使用 deepcopy&#xff08;&#xff09;函数进行深拷贝…