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

前言

大家在学习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.hqwc.cn/news/224884.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element table滚动条失效

问题描述:给el-table限制高度之后滚动条没了 给看看咋设置的&#xff1a; <el-table:data"tableData"style"width: 100%;"ref"table"max-height"400"sort-change"changeSort">对比了老半天找不出问题&#xff0c;最后…

DS图—图的最短路径/Dijkstra算法【数据结构】

DS图—图的最短路径/Dijkstra算法【数据结构】 题目描述 给出一个图的邻接矩阵&#xff0c;输入顶点v&#xff0c;用迪杰斯特拉算法求顶点v到其它顶点的最短路径。 输入 第一行输入t&#xff0c;表示有t个测试实例 第二行输入顶点数n和n个顶点信息 第三行起&#xff0c;每行…

ATA-7030高压放大器在等离子体实验中的应用有哪些

高压放大器在等离子体实验中有多种重要应用。等离子体是一种带电粒子与电中性粒子混合的物质&#xff0c;其具有多种独特的物理性质&#xff0c;因此在许多领域具有广泛的应用&#xff0c;例如聚变能源、等离子体医学、材料加工等。下面安泰电子将介绍高压放大器在等离子体实验…

【Rust】快速教程——自定义类型、数字转枚举、Cargo运行

前言 超过一定的年龄之后&#xff0c;所谓人生&#xff0c;无非是一个不断丧失的过程而已。宝贵的东西&#xff0c;会像梳子豁了齿一样从手中滑落下去。你所爱的人会一个接着一个&#xff0c;从身旁悄然消逝。——《1Q84》 \;\\\;\\\; 目录 前言自定义类型数字转枚举Cargo.tom…

oracle数据库备份2(expdp)

使用exp命令定时进行数据库备份的操作前面已经记录过&#xff1a; oralce数据库定时备份 下面记录下使用更加高效的expdp命令和impdp&#xff0c;这两个命令同样是用来做数据库备份和还原的&#xff0c;但速度更快&#xff0c;效率更高&#xff0c;缺点是只能用在服务器端进行…

Seata简介与常用模式解决方案概述

Seata 是什么? Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。 Seata事务管理中有三个重要的角色&#xff1a; TC (Transaction Coordinator) - 事务协调者&#xff1a;维护全局和分支事务的状态&#xff0c;协调全局事务提…

JAVAEE初阶 多线程基础(四)

join的知识补充,线程的状态和线程安全 一.多线程完成运算操作二.多线程代码的变换2.1 转换成串行执行 三.join的参数四.获取线程的引用4.1用this方法获取实例4.2 用currentThread获取实例 五.线程的状态六.线程安全 一.多线程完成运算操作 可以发现,多线程并行比单线程的速度快…

Unity EventSystem的一些理解和使用

Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一&#xff0c;可以用于捕捉和分发各种事件&#xff0c;例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些&#xff1a; 属性&#xff1a; current: 获取当前的EventSystem实例。…

Ubuntu 22.03 LTS 安装deepin-terminal 实现 终端 分屏

deepin-terminal 安装 源里面自带了这个软件&#xff0c;可以直接装 sudo apt install deepin-terminal 启动 按下Win键&#xff0c;输入deep即可快速检索出图标&#xff0c;点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口&#xff0…

销售流程中如何有效开发客户

在销售的海洋中&#xff0c;如何游刃有余地开发客户是一大关键。这需要深入了解你的目标客户&#xff0c;制定一份精细的销售计划&#xff0c;选择最合适的沟通方式&#xff0c;建立信任和信誉&#xff0c;并持续不断地跟进。 每一个潜在的客户都是一颗璀璨的星辰&#xff0c;…

医学影像PACS源码:PACS系统的基础知识(DICOM、HL7、SWF)

1、PACS PACS是Picture Archiving and Communication Systems首字母缩写&#xff0c;全称为影像储存和传输系统&#xff0c;涉及放射医学、计算机技术、通讯技术及数字图像技术等&#xff0c;是医院信息系统的重要组成部分&#xff0c;是将数字医疗设备(如X线、CT、MRI、超声、…

ModuleNotFoundError: No module named ‘mdtex2html‘ module已经安装还是报错,怎么办?

用streamlit运行ChatGLM/basic_model/web_demo.py的时候&#xff0c;出现了module not found&#xff1a; ModuleNotFoundError: No module named mdtex2html Traceback: File "/home/haiyue/.local/lib/python3.10/site-packages/streamlit/runtime/scriptrunner/script…