C++之STL库:string类(用法列举和总结)

news2024/9/29 11:38:23

前言

大家在学习STL库的时候一定要学会看英文文档,俗话说熟能生巧,所以还得多练!

在使用string类之前,要包含头文件#include <string>和using namespace std;

文档链接:string - C++ Reference

一、string——构造相关操作

1. string(); (常用)

构造一个空字符串

string s1;

2. string(const char *s); (常用)

使用字符串构造一个实例化对象

 string s2("hello world");

3. string(const string& str); (常用)

使用string的实例化对象去拷贝构造另外一个实例化对象

string s2("hello world");
string s3(s2);

4. string& operator=(const string& str); (常用)

string s2("hello world");
string s4 = s2;

5. string& operator=(const char *s); (常用)

 string s5 = "hello world";

6. string& operator=(char c);

这里有一点需要注意,赋值运算符重载和拷贝构造的区别,两个对象都是定义之后的=是赋值运算符重载,如果是在定义的时候的=,属于拷贝构造;

所以代码1是不正确的:因为这是拷贝构造,而在拷贝构造这里,没有将一个字符拷贝给string类的函数实现

正确的写法:

    string s6;
    s6 = 'x';

7. string (const string& str, size_t pos, size_t len = npos);

拷贝str,在pos的下标开始,拷贝len个长度。

string s7 = "hello world";
string s8(s7, 0, 3);

8. string (const char* s, size_t n);

从s上拷贝前n个字符

    string s9("hello world", 4);

9. string (size_t n, char c);

拷贝n个一样的字符

    string s10(10, 'x');

10. string (InputIterator first, InputIterator last);

用迭代器拷贝,first为头,last为尾,拷贝first<= string <last,也就是拷贝从first位置开始,在last前一个位置停下来,不拷贝last位置;(默认迭代器的end是在\0位置)

    string s11 = "hello world";
    string s12(s11.begin(), s11.end()-1);

二、string——打印相关操作

1. 输入字符串cin

可以从键盘上输入字符串,但是遇到空格就结束输入

    string s1;
    cin >> s1;
    cout << s1 << endl;

2. 输出字符串cout

将字符串的内容打印到显示器上

3. 获取字符串getline

从流中获取字符串,输入空格不会停止

    string s1;
    getline(cin, s1);
    cout << s1 << endl;

三、string——访问和遍历相关操作

1. char& operator[] (size_t pos);

通过下标访问字符串元素

    string s1 = "hello world";
    cout << s1[0] << endl;

2.  char& at (size_t pos);

跟下标访问一样,只是报错的方式不同;

    string s1 = "hello world";
    cout << "字符串第5个字符为:" << s1.at(4) << endl;

3. iterator begin();和 iterator end();

begin获取字符串第一个字符的迭代器(可以理解取第一个字符的地址)

end获取最后一个字符的下一个位置的迭代器(可以理解取最后一个有效字符下一个位置的地址)

    string s1 = "hello world";
    string::iterator begin = s1.begin(); 
    string::iterator end = s1.end();

可以像指针那样的遍历

    string s1 = "hello world";
    string::iterator begin = s1.begin();
    string::iterator end = s1.end();
    while(begin < end)
    {
        cout << *begin << ' ';
        ++begin;
    }
    cout << endl;

也可以访问第几个位置的元素,但是一般用下标访问了

    string s1 = "hello world";
    string::iterator begin = s1.begin();
    string::iterator end = s1.end();
    cout << "访问第1个元素为:" << *begin << endl;
    cout << "访问第5个元素为:" << *(begin + 4) << endl;
    cout << "访问倒数第3个元素为:" << *(end - 3) << endl;

4. reverse_iterator rbegin();和 reverse_iterator rend();

rbegin:指向的是最后一个有效字符的迭代器,从后往前访问;

rend:指向的是第一个字符之前的迭代器,从前往后访问;

    string s1 = "hello world";
    string::reverse_iterator  rb = s1.rbegin();
    string::reverse_iterator re = s1.rend();
    while(rb < re)
    {
        cout << *rb << ' ';
        ++rb;
    }

5. 范围for遍历

很简洁,但是底层依旧是迭代器;

    string s1 = "hello world";
    for(auto e : s1)
    {
        cout << e << ' ';
    }
    cout << endl;

四、string——容量相关操作

1. size

计算字符串的长度,以字节为单位

string s1 = "hello world";
int len = s1.size();
cout << len << endl;

2. capacity

返回当前为字符串已经分配的空间大小,以字节为单位,这个空间表示出来的是给有效字符存的空间,但是实际上会比表示的空间多出来一个,用来存\0;

分配的空间会大于字符串的size,但是分配的空间有可能不同,这取决于不同的编译器;

string s1 = "hello world";
cout << s1.capacity() << endl;

3. empty

判断字符串是否为空串:为空返回true(非0),不为空,返回false(0)

    string s1 = "hello world";
    cout << s1.empty() << endl;
    string s2;
    cout << s2.empty() << endl;

4. clear

只清空字符串的有效内容,不销毁空间;清空内容之后,size为0,capacity不变

    string s3 = "hello world";
    cout << "清空之前的容量:" << s3.capacity() << endl;
    cout << "清空之前的长度:" <<s3.size() << endl;

    s3.clear();
    cout << "清空之后的容量:" << s3.capacity() << endl;
    cout << "清空之后的长度:" <<s3.size() << endl;

5. reserve

为字符串保留空间

规则:

1. 扩容:当保留的空间 > capacity,认为扩容。每个编译器扩容的空间是不同的,总体上看就是:实际扩容下的空间≥要保留的空间;

2. 缩容:当保留的空间 < capacity ,认为缩容。有的编译器不会缩容,有的编译器会缩容,如果保留的空间<size,只缩容到size大小。

    string s4 = "hello world";
    cout << "扩容之前的容量:" << s4.capacity() << endl;
    s4.reserve(100);
    cout << "扩容之后的容量:" << s4.capacity() << endl;

    string s4 = "hello world";
    cout << "缩容之前的容量:" << s4.capacity() << endl;
    s4.reserve(2);
    cout << "缩容之后的容量:" << s4.capacity() << endl;

6. resize

void resize (size_t n);
void resize (size_t n, char c);
将有效字符的个数该成n个;
n > capacity :size = n ,capacity ≥ n,若提供c,则后面全为c字符,若没提供,则为‘\0’;
并不是\0就是无效字符,对于有效字符的设定是根据在0~size-1之间的都是有效字符;
    string s5 = "hello world";
    cout << s5 << endl;
    cout << "调整有效字符之前的容量:" << s5.capacity() << endl;
    cout << "调整有效字符之前的长度:" <<s5.size() << endl;

    s5.resize(30);
    cout << s5 << endl;
    cout << "调整有效字符之后的容量:" << s5.capacity() << endl;
    cout << "调整有效字符之后的长度:" <<s5.size() << endl;

    string s5 = "hello world";
    cout << s5 << endl;
    cout << "调整有效字符之前的容量:" << s5.capacity() << endl;
    cout << "调整有效字符之前的长度:" <<s5.size() << endl;

    s5.resize(30, 'x');
    cout << s5 << endl;
    cout << "调整有效字符之后的容量:" << s5.capacity() << endl;
    cout << "调整有效字符之后的长度:" <<s5.size() << endl;

size < n < capacity ,size = n,capacity不变;若提供c,则后面全为c字符,若没提供,则为‘\0’;

n < size ,size = n ,删数据,保留前n个有效字符,capacity不变;

五、string——增加操作(未完结)

1. string& operator+= (char c);

尾插字符

    string s1 = "hello world";
    cout << s1 << endl;
    s1 += 'x';
    cout << s1 << endl;

2. string& operator+= (const string& str);

尾插字符串

    string s1 = "hello world";
    cout << s1 << endl;
    s1 += s1;
    cout << s1 << endl;

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

尾插字符串

    string s1 = "hello world";
    cout << s1 << endl;
    s1 += " hello CSDN";
    cout << s1 << endl;

六、string——删除操作(待更新)

七、string——查找操作(待更新)

八、string——改数据操作(待更新)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【API 自动化测试】Eolink Apikit 图形用例详解

Eolink Apikit 的图形用例是指通过图形化的方式去表现 API 流程测试。它包括了条件选择器、单个 API 步骤和操作集等组件。 相较于前面推荐的表格化的通用用例&#xff0c;图形用例可以让测试人员更方便地设计和管理 API 流程测试&#xff0c;同时也更加的灵活。 添加图形用例…

第29期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

【密码学引论】序列密码

第五章 序列密码 1、序列密码 定义&#xff1a; 加密过程&#xff1a;把明文与密钥序列进行异或运算得到密文解密过程&#xff1a;把密文与密钥序列进行异或运算得到明文以字/字节为单位加解密密钥&#xff1a;采用一个比特流发生器随机产生二进制比特流 2、序列密码和分组密…

前馈式神经网络与反馈式神经网络的区别,联系,各自的应用范围和场景!!!

文章目录 前言一、前馈式神经网络是什么&#xff1f;二、前馈式神经网络包括&#xff1a;三、反馈式神经网络是什么&#xff1f;四、反馈式神经网络包括&#xff1a;总结 前言 前馈式神经网络和反馈式神经网络是两种主要的神经网络架构&#xff0c;它们在网络结构和应用场景上…

OpenCV快速入门【完结】:总目录——初窥计算机视觉

文章目录 前言目录1. OpenCV快速入门&#xff1a;初探2. OpenCV快速入门&#xff1a;像素操作和图像变换3. OpenCV快速入门&#xff1a;绘制图形、图像金字塔和感兴趣区域4. OpenCV快速入门&#xff1a;图像滤波与边缘检测5. OpenCV快速入门&#xff1a;图像形态学操作6. OpenC…

深度学习18

卷积层 查看每个数据 使用tensorboard查看 池化层 使用数据集进行训练 创建实例&#xff0c;使用tensorboard进行显示 最大池化保留了图片信息&#xff0c;神经网络训练的数据量大大减小&#xff0c;可以加快训练 非线性激活 非线性激活为神经网络加入了一些非线性的特质…

ChinaSoft 展商风采 | 蚂蚁集团:CodeFuse-Query代码大数据分析平台

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

Java---类的继承

文章目录 1. 理解继承2. 继承概述3. 代码块理解4. 继承的好处与弊端5. 继承中变量的访问特点6. super关键字7. 继承中构造方法访问特点8. 继承中成员方法访问特点9. 方法重写10. 方法重写注意事项11. Java继承注意事项 1. 理解继承 2. 继承概述 1. 继承是面向对象的三大特征之一…

ILSVRC2012数据集处理

ILSVRC2012数据集处理 解压图像处理标签和图像 解压图像 先解压 tar -xvf ILSVRC2012_img_train.tar 解压之后其实还是1000个tar压缩包&#xff08;对应1000个类别&#xff09;&#xff0c;需要再次解压&#xff0c;解压脚本unzip.sh如下&#xff08;PS&#xff1a;可能需要自…

银行合规知识竞赛要怎么策划才高大上

合规是银行业务永恒的主题&#xff0c;也是银行发展的根本保障。加强合规知识的学习和理解是保障银行业务健康发展的基础。通过竞赛形式的开展&#xff0c;旨在增强员工对风险和合规的敏感度和关注度&#xff0c;推动全行合规水平全面提升。那么如何策划一场高水平的银行合规知…

开发环境配置整理大全——Visual Studio 最新安装篇

Visual Studio是微软的集成开发环境&#xff08;IDE&#xff09;&#xff0c;以Windows为主的平台开发的一套功能全面而强大的IDE&#xff0c;支持C#、F#、VB、C/C、HTML等36 种语言的开发。开发人员常使用的开发工具之一&#xff0c;Visual Studio今年4月出了最新版本的2022款…

Ubuntu系统CLion安装

Ubuntu系统CLion安装 pycharm 同理。 参考官网安装过程&#xff1a;官网安装过程 下载linux tar.gz包 # 解压 sudo tar -xzvf CLion-*.tar.gz -C /opt/ sh /opt/clion-*/bin/clion.sh其中第二个命令是启动CLion命令 clion安装完以后&#xff0c;不会在桌面或者菜单栏建立图…

数学公式KaTex识别神器,LaTex-OCR

使用KaTex格式来书写数学公式是个痛苦的事情&#xff0c;有时候看到某个数学公式想记录下来&#xff0c;为了省事不得不截图&#xff0c;但这很不专业&#xff0c;今天发现一个可以智能识别公式的程序&#xff0c;它使用机器学习模型来识别图像&#xff0c;并转化成KaTex代码&a…

vmware虚拟机怎么安装linux-rocky操作系统

vmware虚拟机安装linux-rocky操作系统 rocky下载地址&#xff1a;https://rockylinux.org/zh_CN/download/ 我下载boot版本&#xff0c;安装时候需要联网。 接下来一路下一步&#xff0c;硬盘这里可以选择“将虚拟磁盘存储为单个文件”&#xff0c;然后一直点击到完成就可以。…

【C 语言经典100例】C 练习实例9

题目&#xff1a;要求输出国际象棋棋盘。 程序分析&#xff1a;国际象棋棋盘由64个黑白相间的格子组成&#xff0c;分为8行*8列。用i控制行&#xff0c;j来控制列&#xff0c;根据ij的和的变化来控制输出黑方格&#xff0c;还是白方格。 #include<stdio.h>int main() {…

《社交泛娱乐出海作战地图》加印领取啦!

全网都在找的、内容扎实形制精炼的行业首款 融云《社交泛娱乐出海作战地图》 响应需求&#xff0c;惊喜加印啦&#xff01; 久等的大家点击上图或阅读原文获取吧~ 关注【融云全球互联网通信云】了解更多 发布以来&#xff0c;《地图》两次加印均被抢购一空。 公众号后台、朋友…

SAP SM30及ABAP维护ADRC中央地址主数据(BAS)

文章背景&#xff1a; 项目组员在创建SM30的时候&#xff0c;发现了下图的报错&#xff0c;原因是因为自建表中的地址编号ADRNR字段使用了标准的数据元素AD_ADDRNUM&#xff0c;当使用包含该数据元素的视图在SM30进行维护时&#xff0c;就会出现下面的报错AM287。 后续了解到&…

python操作Mysql学习

文章目录 版权声明准备&#xff1a;MYSQL数据库数据库简介数据库分类数据库管理系统SQL语句关系型数据库中核心元素MySQL环境搭建Mysql数据类型数据完整性和约束MYSql基本操作登录和退出数据库命令数据库基本操作命令数据表基本操作命令数据表结构修改命令表数据操作命令Mysql查…

Programming Abstractions in C阅读笔记:p197-p201

《Programming Abstractions in C》学习第64天&#xff0c;p196-p201总结。 一、技术总结 很难&#xff0c;唯有继续往下看才能让其变容易。 二、英语总结 1.psychologically是什么意思&#xff1f; 答&#xff1a; (1))psychology > psychological > psychologica…

filebeat日志收集工具

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非Java环境上收集日志 filebeat无法实现数据的过滤&…