当前位置: 首页 > news >正文

【C++】string类

目录

1. string类对象的常见构造

2 string类对象的容量操作

3.strin类对象的访问及变量操作

4.string类对象的修改操作

5.string类非成员函数


1. string类对象的常见构造

        string的构造函数含有多种重载,常用如下:

// 1
string();//构造空的string类对象,即空字符串;

// 2
string(const char* s)// 用字符串 s 来构造string类;

// 3
string(size_t n, char c)//用n个字符c来构造string类;

// 4
string(const string& str)//用string类对象str,构造string类。即拷贝构造;

代码实例:

// 1
string str1(); //构造一个空类

// 2
string str2("Hello World!!!!"); //用字符串Hello World!!!!构造一个类

// 3
string str3(5,'H');//用5个字符构造一个类

// 4
string str4(str2);//构造一个和str2一样的类

2 string类对象的容量操作

        1)size : 返回自字符串的有效长度;

函数原型: size_t size ( ) const

        2)legth : 返回自字符串的有效长度;

函数原型: size_t length  ( ) const

        3) capacity : 返回空间总大小(不包含‘\0’);

函数原型: size_t capacity ( ) const

        4) reserve : 为字符串提前开辟空间;

函数原型 : void reserve (size_t n = 0)

         reserve()函数只开空间,也只改变容量。当知道需要多大空间时可以提前开好,以免扩容产生性能不必要的浪费。

代码:

#include<iostream>
#include<string>
using namespace std;

void text1()
{

	string str1("hello world!!!");

	size_t size = str1.size(); //字符串的长度
    cout << size << endl;
	cout << endl;

	size_t capacity = str1.capacity(); //总空间的大小
	cout << capacity << endl;

	str1.reserve(100);

	cout << endl;
	size = str1.size(); //字符串的长度
	cout << size << endl;

	cout << endl;
	capacity = str1.capacity(); //总空间的大小
	cout << capacity << endl;

}

int main()
{
	text1();
	return 0;
}

        5) resize : 将有效字符的个数改成n个

函数原型: void resize ( size_t  n)

                   void resize (size_t  n, char c)

         1)当 n 小于 capacity时,只改变 size 的大小,将size改为n,不改变capacity的大小;

执行resize( 5 )前:

 执行后:

 结果:

         2)当 n 大于 capacity时,size、 capacity 的大小都会改变,并且会用 ‘\0’填充,若为函数2则用字符ch 填充;

执行resize( 50 )前:

执行后:

 

 

 代码:

void text1()
{

	string str1("hello world!!!");

	size_t size = str1.size(); //字符串的长度
    cout << size << endl;
	cout << endl;

	size_t capacity = str1.capacity(); //总空间的大小
	cout << capacity << endl;

	str1.resize(50);

	cout << endl;
	size = str1.size(); //字符串的长度
	cout << size << endl;

	cout << endl;
	capacity = str1.capacity(); //总空间的大小
	cout << capacity << endl;

}

结果:

         6)empty : 检测字符串是释放为空串,是返回true,不是返回 false

函数原型:bool empty() const

         7)clear :清空字符串

函数原型:void clear()

将字符串清空,改变size,但是不会改变空间大小

 注意:

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

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

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

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

3.strin类对象的访问及变量操作

        1)operator[] : 返回pos位置的字符

函数原型:char& operator[] (size_t pos)

                  const char& operator[] (size_t pos)const

 因为函数是传引用返回,所以该字符可以直接被修改;即:

 当然了如不想被更改,只能访问,那可以定义为const类型

 代码:

void text2()
{
	const string str1("hello world!!!");

	cout << str1[0] << endl;

	cout << endl;
	cout << str1 << endl;
	//str1[0] = 'H';
	cout << str1 << endl;

}

        2)迭代器 begin  end :begin获取第一个字符迭代器,end获取最后一个字符下一个位置的迭代器。

函数原型:iterator begin();

                  const_iterator begin() const;

                  iterator end();

                  const_iterator end() const;

迭代器像指针,它的底层实现有可能是指针,也有可能不是指针,但是它的使用方法和指针样。

 可以遍历字符串如①所示,也可更改字符串如②所示。

代码:

void text3()
{
	string s1("hello world!!!");
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it;
		++it;
	}

	cout << endl;
	it = s1.begin();
	while (it != s1.end())
	{
		(*it)++;//更改字符
		cout << *it;
		++it;

	}
}

 若使用const类型的迭代器,字符串也将不能改变。

        3)反向迭代器 rbegin ,rend : rbegin获取最后一个字符位置的迭代器,rend获取第一个字符前一个位置的迭代器,与begin和end刚好相反。遍历字符串也是倒着遍历;

 当然它也可更改字符串。

代码:

void text4()
{
	string s1("hello world!!!");
	string::reverse_iterator it = s1.rbegin();
	while (it != s1.rend())
	{
		cout << *it;
		++it;
	}

	cout << endl;
	it = s1.rbegin();
	while (it != s1.rend())
	{
		(*it)++;
		cout << *it;
		++it;

	}
}

 若不想字符串被改变可用const修饰。

        5)范围for 

        除了用迭代器遍历字符串之外,也可用范围for,范围for的底层原理便是迭代器。

范围for 自动迭代,自动判断结束

 代码:

void text5()
{
	string s1("hello world!!!");

	for (auto e : s1)//依次取出s1中字符给e;
	{
		cout << e;
	}
	cout << endl;

}

 当然f范围for也可更改字符,用引用即可:

 代码:

void text6()
{
	string s1("hello world!!!");

	for (auto& e : s1)//依次取出s1中字符给e;
	{
		e++;
		cout << e;
	}
	cout << endl;

}

4.string类对象的修改操作

        1)push_back :在字符串后尾插字符;

函数原型: void push_back(char  c)

在字符串后尾插字符c;

        2)pop_back :  删除最后一个字符;

函数原型: void pop_back( );

        3)append : 在字符串后面追加一个字符串

函数原型:string& append (const char* s)  (不止这一种,其他可参考string类文档)

        4)operator+= :  在字符串后加上字符或者字符串;

函数原型:string& operator+=(const string& str);

                  string& operator+=  (const char* s);

                  string& operator+=  (const char c);

        5)c_str :返回C格式字符串(返回一个指针,这个指针指向由string类的字符所构成的数组)

函数原型: const char* c_str( ) const;

        6)find:从字符串pos位置开始往后找字符/字符串,返回该字符/字符串的位置

函数原型:size_t find (const string& str, size_t pos = 0) const;

                   size_t find (const char* s, size_t pos  =  0)  const;

                   size_t find(char c , size_t pos = 0) const;

从pos的位置往后找,在字符串中找到与之完全相同的子串且是第一次出现,返回下标,若未找到返回 string:npos;  nops 为 static const size_t npos = -1,即:size_t类型的最大值;

        7)rfind: 从字符串pos位置开始往前找字符/字符串,返回该字符/字符串的位置

函数原型:size_t rfind (const string& str, size_t pos = npos) const;

                   size_t rfind (const char* s, size_t pos  =  npos)  const;

                   size_t rfind(char c , size_t pos = pons) const;

 与函数find的功能基本相同 ,区别在于rfind是用pos的位置往前找。

        8)substr : 在字符串中从pos位置开始,截取n个字符,然后将其返回;

函数原型:string substr (size_t pos = 0, size_t len = npos) const;

 从pos的位置截取len长度的字符串,并以string类返回;

 注意:

  •  在string尾部追加字符时,push_back , append ,  +=  三种的实现方式差不多,一般情况下string类的+=操作用的较多,+=不仅能够连接字符,也可连接字符串。
  • 对string操作时,如果能大概预估到放多少字符,可以先通过reserve把空间预留好

5.string类非成员函数

        1)operator<<: 输出运算符重载; operator>> : 输入运算符重载

输出运算符重载是将string类类型直接输出,前面已经用过,不在赘述;

输入运算符重载:即将你在键盘上输入的字符放入string类里,但是它有个缺陷,遇到空格 或者换行符,就会结束本次输入,即当我输入 HHH空格HH是在string类里只有HHH;

 空格后面的两个HH将保存在缓冲器,如果后面依然后cin<<将直接给string类不用再输入

 那问题来了 我想输入带有空格的字符串怎么办? 那就要借助下面一个函数了

2)getline:

函数原型:istream& getline (istream& is, string& str);

该函数可以实现输入空格:还是我要输入HHH空格HH:


以上是string常用的接口,除此之外string类还有很多接口,感兴趣的伙伴可以去查手册。以上就是本篇博客的全部内容,若有错误,欢迎各位佬指正。感激不尽!!!!

相关文章:

  • 一级建造师考试大纲要改版了?对2022年的考试有影响吗?
  • CSS 伪类选择器 last-child 和 last-of-type 的区别
  • string
  • Vue简介及简单应用
  • 停止线程的方法
  • java计算机毕业设计计算机专业在线学习评估软件-演示录像-源码+数据库+系统+lw文档+mybatis+运行部署
  • STM32Cube学习(2)——定时器中断
  • jenkins安装部署(前端+后端)自动发布
  • docker logs 命令
  • 数据结构和算法-全文总结
  • 漏洞复现-CVE-2022-1388命令执行F5 BIG-IP iControl REST
  • labelme标注及标签的统一
  • 日常开发中比较使用的命令行
  • 项目管理证书 PMP 的含金量高吗?
  • RS笔记:深度推荐模型之多任务学习PLE模型 [RecSys 2020 最佳论文 腾讯]
  • 30天自制操作系统-2
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • co.js - 让异步代码同步化
  • eclipse的离线汉化
  • Go 语言编译器的 //go: 详解
  • IP路由与转发
  • JavaScript 基础知识 - 入门篇(一)
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MobX
  • PHP 的 SAPI 是个什么东西
  • React as a UI Runtime(五、列表)
  • Vue官网教程学习过程中值得记录的一些事情
  • Yii源码解读-服务定位器(Service Locator)
  • 彻底搞懂浏览器Event-loop
  • 搞机器学习要哪些技能
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 回流、重绘及其优化
  • 基于 Babel 的 npm 包最小化设置
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 如何使用 JavaScript 解析 URL
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Spring Batch JSON 支持
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​520就是要宠粉,你的心头书我买单
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (1)(1.13) SiK无线电高级配置(五)
  • (3)(3.5) 遥测无线电区域条例
  • (libusb) usb口自动刷新
  • (第30天)二叉树阶段总结
  • (二)丶RabbitMQ的六大核心
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (三)模仿学习-Action数据的模仿
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ../depcomp: line 571: exec: g++: not found