【C++】String常用的函数总结

目录

一、string的构造函数方式:

二、常用的大小/容量相关操作: 

三、string的常用修改操作:

四、string的遍历:

五、string的任意位置插入 / 删除:

六:补充:


一、string的构造函数方式:

代码形式:

void Test1()
{
	string s1();				// 空字符串
	string s2("Hello World");	// 字符串初始化为 "Hello World" 
	string s3(s2);				//拷贝构造: 将s2复制给s3、  输出为: Hello World
	string s4(s2, 2, 3);		// 从 s2 的下标 2 的位置开始复制 3 个值给 s4,输出为: llo
	string s5(s2, 3);			// 从 s2 的下标 3 的位置开始 复制到结尾个字符给 s5,输出为: llo World
	string s6(5, '#');			// 生成5个字符为 # 的字符串,输出为: #####

}

二、常用的大小/容量相关操作: 

 

代码形式:

void Test2()
{
	string s1("Hello World");
	cout << s1.size() << endl;		// 输出为 11
	cout << s1.length() << endl;	// 输出为 11
	cout << s1.max_size() << endl;	// 支持的最大长度
	cout << s1.capacity() << endl;	// 输出为 15
	
	// clear清除有效数据,但不清除空间(capacity)
	s1.clear();
	cout << s1 << endl; // 输出为空,因为clear清除了有效字符

	// reserve 可以直接开空间,省去字符串追加字符时的自动扩容操作,提高一点效率
	s1.reserve(100);	// 扩容时有效编译器并不一定会只扩到给定值,有可能会多扩容一些空间
	cout << s1.capacity() << endl; // 当 reserev 中的参数小于capacity时并不会进行缩容
	
	// 缩容: shrink_to_fit 
    // 缩容到16(显示的是15,但是一般会包含算上\0入内,capacity不算上\0,所以实际是16)
	s1.shrink_to_fit();
	cout << s1.capacity() << endl;// 输出16

	// resize 
	string s2("Hello");
	s2.resize(7, '#'); // 将 s2 的有效字符个数改成7个,不足7个的用 # 替换
	// resize 当不指定第二个参数时默认为'\0'
	// 当resize 给的值大于 capacity 时 resize 会进行相应的扩容 
	// 当resize 给的值小于 capacity 时 resize 不会进行缩容 

	cout << s2 << endl; // 输出为: Hello##
}

三、string的常用修改操作:

 

代码形式: 

void Test3()
{
    string s1;
    string s2("Hello");
    s1.push_back('c');
    s1.append("ccccc");
    s1 += "abcde"; // 一般用 += 比较多,因为可以直接追加字符/字符串
    s1 += s2;

    // find(c, n): 从下标 n 位置查找字符 c ,找到返回下标,找不到返回npos
    // replace(n, m, "c"): 从下标 n 开始的 m 个字符 替换为c:

    // 以上两个结合使用讲解: 将s3中的空格替换为 ##
    string s3("Youth gives you light please don't let it down");
    size_t pos1 = s3.find(' '); // find 不给右参数时默认从 0 开始
    while (pos1 != string::npos)
    {
        s3.replace(pos1, 1, "##");
        pos1 = s3.find(' ');
    }
    cout << s3 << endl;

    // rfind 用法和 find 相似,不同的是 rfind 是从后往前找
    // rfind(c, n) 从第 n 个位置往前找 c ,找到返回下标,找不到返回npos
    // rfind不给右参数时默认从字符串最末尾开始

    // substr(n, m) 主要功能为复制子字符串,从下标 n 开始,复制 m 个字符
    string s4("Hello World!");
    string s5 = s4.substr(3, 5); // 输出为: lo Wo

    // 当substr不给参数时就为直接拷贝构造
    string s6 = s4.substr(); // 输出为: Hello World!

    // 当只给定左参数时,就从 n 开始复制到结尾
    string s7 = s4.substr(3); // 输出为: lo World!

}

四、string的遍历:

进行字符串的遍历时可以用下标法或者借助迭代器进行遍历。

代码形式:

void Test4()
{
    string s1("Hello World");
    // 下标法: C++中重载了 [] 符号,加上对应的下标即可访问
    for (int i = 0; i < s1.size(); i++)
    {
        cout << s1[i] << " ";
    }
    cout << endl;

    // 借助迭代器:
    // str.begin()   指向字符串的第一个字符位置
    // str.end()     指向字符串的最后一个字符的下一个位置
    string::iterator it1 = s1.begin();
    while (it1 != s1.end())
    {
        cout << *it1 << " ";
        it1++;
    }
    cout << endl;

    // 反向迭代器:
    // str.rbegin()   指向字符串的最后一个字符的位置
    // str.rend()     指向字符串的第一个字符的前一个位置
    string::reverse_iterator rit1 = s1.rbegin();
    while (rit1 != s1.rend())
    {
        cout << *rit1 << " ";
        rit1++;
    }
    cout << endl;
}

 

五、string的任意位置插入 / 删除:

但是在实践中一般很少用到 insert 与 erase 因为要挪动数据,效率很低。

代码形式: 

void Test5()
{
    string s1("Hello World!");
    s1.insert(2, "##");
    cout << s1 << endl; // 输出: He##llo World!

    string s2("Hello World!");
    s2.erase(4, 6);
    cout << s2 << endl; // 输出: Helld!

}

六:补充:

void Test6()
{
    // compare: 字符串大小比较
    // 原理: 两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇 '\0’为止。
    string s1("abcd");
    string s2("aBcd");

    // s1 与 s2 相比第二个字符 b 的ASCII值大于 B
    cout << s1.compare(s2) << endl; // s1 > s2 所以输出1


    // operator >>   输入运算符重载,可以直接对字符串进行输入
    // operator <<   输出运算符重载,可以直接对字符串进行输出
    string s3;
    cin >> s3;
    cout << "s3: " << s3 << endl;

    // getline(cin, str) 获取一行字符串
    // cin 输入时默认空格是作为结束分隔,所以可以用getline将空格输入字符串中
    string s4;
    getline(cin, s4);
    cout << "s4: " << s4 << endl;

}

注意事项:

1、cin 与 getline 一起用时注意:

        cin只是在缓存区中,把字符读走,会剩余\n在缓存区中,但是getline对\n极度敏感,如果上一个 cin 完立马接 getline 的话会导致getline刚开始读入便遇到/n于是停止读入数据。

解决方法:可以手动清除换行符,cin 后加上   cin.ignore();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb环境配置 IDE2022版

一、新建一个javaweb文件 文件名可以自己随意改 二、给建立的项目添加框架支持 勾选Web Application,点击确定 建立成功界面&#xff0c;会生成一个新的web文件夹 三、配置tomcat 1、两种打开配置文件方式&#xff1a; 第一种 第二种 2、打开后&#xff0c;点击号&#xf…

LLM | Gemma的初体验

一起来体验一下吧~ google/gemma-7b-it Hugging Face 此型号卡对应于 Gemma 型号的 7B 指令版本。还可以选择 2B 基本模型、7B 基本模型和 2B 指导模型的模型卡。 微调 使用 QLoRA 对 UltraChat 数据集执行监督微调 &#xff08;SFT&#xff09; 的脚本在 TPU 设备上使用 FS…

鸿蒙Harmony应用开发—ArkTS声明式开发(手势处理:绑定手势方法)

为组件绑定不同类型的手势事件&#xff0c;并设置事件的响应方法。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 绑定手势识别 通过如下属性给组件绑定手势识别&#xff0c;手势识别成功后可以通过事…

LVS负载均衡集群基础概念

目录 一、集群 1、集群概述 1.1 什么是集群 1.2 集群系统扩展方式 1.2.1 Scale UP&#xff08;纵向扩展&#xff09; 1.2.2 Scale OUT&#xff08;横向扩展&#xff09; 1.2.3 区别 1.3 分布式系统 1.4 分布式与集群 1.5 集群设计原则 1.6 集群设计实现 1.6.1 基础…

手回科技:人生的“小雨伞”,能否撑起自己的增长路?

有道是一年之计在于春。新年伊始&#xff0c;多家券商发布研报表达了对2024年保险市场表现的观点。 比如&#xff0c;开源证券表示&#xff0c;政策组合拳带来beta催化&#xff0c;保险业务端和弹性占优&#xff1b;中国银行证券指出&#xff0c;2024年&#xff0c;保险行业景…

Leetcode 第 125 场双周赛题解

Leetcode 第 125 场双周赛题解 Leetcode 第 125 场双周赛题解题目1&#xff1a;3065. 超过阈值的最少操作数 I思路代码复杂度分析 题目2&#xff1a;3066. 超过阈值的最少操作数 II思路代码复杂度分析 题目3&#xff1a;3067. 在带权树网络中统计可连接服务器对数目思路代码复杂…

Marin说PCB之POC电路layout设计仿真案例---01

最近娃哈哈饮料突然爆火&#xff0c;看新闻后才知道春晚的的时候宗老已经病的很严重了&#xff0c;现在也已经离我们而去了&#xff0c;宗老是一个值得我们尊敬爱戴的伟大企业家。于是乎小编我立马去他们的直播间买了一箱娃哈哈AD钙奶支持一下我们的国货。 中午午休的时候&…

智慧城市的未来:利用数字孪生技术推动智慧城市的智能化升级

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、城市规划与建设 2、城市管理与运营 3、公共服务与民生改善 4、应急管理与灾害防控 四、数字孪生技术推动智慧城市的智能化升级的价值 1、提高城市管理的智能化水平 2、优化城市资源配置 …

python将conda环境打入docker环境中

1.假设你本地已经安装好了conda相关的 ubuntu安装python以及conda-CSDN博客 并且已经创建启动过相关的环境&#xff0c;并且install了相关的包。 我本地的conda环境叫做,gptsovits_conda3 2.下载conda打包工具 conda install conda-pack pip install conda-pack 3.打包 con…

java八股文复习-----2024/03/04----基础

相关资源 大彬八股文 2024八股文 2024秋招八股文 1.了解Java的包装类型吗&#xff1f;为什么需要包装类&#xff1f; Java 是一种面向对象语言&#xff0c;很多地方都需要使用对象而不是基本数据类型。比如&#xff0c;在集合类中&#xff0c;我们是无法将 int 、double 等类型…

lvs集群介绍

目录 一、LVS集群基本介绍 1、什么是集群 2、集群的类型 2.1 负载均衡群集&#xff08;Load Balance Cluster) 2.2 高可用群集(High Availiablity Cluster) 2.3 高性能运算群集(High Performance Computing Cluster) 3、负载均衡集群的结构 ​编辑 4、LVS集群类型中的…

苹果电脑安装Android Studio和配置SDK

大家好&#xff0c;我是你们的好朋友咕噜铁蛋&#xff01;今天&#xff0c;我们要来聊一聊关于《苹果电脑安装Android Studio和配置SDK》这个话题。对于使用苹果电脑的开发者来说&#xff0c;安装Android Studio并配置SDK可能会有些不同&#xff0c;但只要跟着我的指引&#xf…

Linux篇:基础IO

一 预备知识 1. 文件内容属性&#xff0c;内容与属性都是数据&#xff0c;都要在磁盘中保存。 2. 文件分为打开的文件和没打开的文件。 3. 进程在访问一个文件的时候&#xff0c;都是要先打开这个文件。打开文件之前&#xff0c;文件在磁盘&#xff0c;打开文件之后&#xff0…

基于OpenCV的图形分析辨认02

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

【python 1】----Pytest基础知识

定义 用于编写和执行Python测试全功能测试框架&#xff08;工具&#xff09;&#xff0c;是一个第三方库 安装 pip insatll pytest 安装pytest --version 校验 pytest的组成构成 不写调用语句也可以执行函数内容 在用例运行语句里面&#xff1a; -s:指的是开启与终端的…

【CSP试题回顾】201512-2-消除类游戏

CSP-201512-2-消除类游戏 解题思路 输入棋盘大小和颜色: 首先&#xff0c;程序从标准输入读取两个整数n和m&#xff0c;分别代表棋盘的行数和列数。然后&#xff0c;程序读取接下来的n行输入&#xff0c;每行包含m个整数&#xff0c;代表棋盘上每个方格中的棋子颜色。 初始化…

电子台账:通过标签颜色快速区分某月账页是否为空、是否锁定

目录 1 数据为空的账页&#xff0c;标签顶部没有标记色条 2 包含有效数据的账页且未进行锁定&#xff0c;标签顶部为深绿色标记色条 3 包含有效数据的账页且被锁定&#xff0c;标签顶部为橙色标记色条 通过设置账页标签的颜色&#xff0c;快速区分哪些月份的账页数据为空&am…

【书生·浦语大模型实战营】第6节 OpenCompass 大模型评测 课后作业

OpenCompass 大模型评测 0. 课程链接1. 课后作业1.1 基础作业1.2 进阶作业 2. 结业总结 0. 课程链接 链接&#xff1a;https://github.com/InternLM/tutorial/blob/main/opencompass/opencompass_tutorial.md 1. 课后作业 1.1 基础作业 使用 OpenCompass 评测 InternLM2-Cha…

python高级之元类

python高级之元类 一、Type创建类1、传统方式创建类2、非传统方式 二、元类三、总结 一、Type创建类 class A(object):def __init__(self, name):self.name namedef __new__(cls, *args, **kwargs):data object.__new__(cls)return data根据类创建对象 objA(‘kobe’) 1、执…

机器视觉相关网站推荐

机器视觉相关网站推荐 - 知乎计算机视觉&#xff08;Computer Vision&#xff09;最近这几年发展迅速&#xff0c;技术论坛和QQ群也如雨后春笋&#xff0c;特别是人脸检测/识别领域。近段时间云从君从研究院那里探得了好几个论坛&#xff0c;收藏了若干网站&#xff0c;记录下&…