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

news2024/11/25 12:46:04

目录

一、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();

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

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

相关文章

Redis的三种集群模式(图解)

主从复制模式 一个主节点和多个从节点。主节点提供写入和读取功能&#xff0c;但是从属节点只提供读取功能。 主从复制的数据同步过程如下&#xff1a; &#xff08;1&#xff09;首先主节点启动&#xff0c;然后从属节点启动&#xff0c;从属节点会连接主节点并发送SYNC命令以…

SpringCloud Alibaba 学习

一&#xff1a;SpringCloud Alibaba介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服 务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba&…

00X集——CAD vba 填充(hatch)及挖空

首先&#xff0c;画个椭圆&#xff0c;并填充&#xff0c;直接上代码&#xff1a; Sub 画椭圆填充() 2024年3月6日21:10:22 by qq443440204 Dim hat As AcadHatch 填充 Dim ell(0) As AcadEllipse 椭圆 Dim cent(0 To 2) As Double 椭圆中心点 Dim dd(0 To 2) As Double 椭圆长…

Android开发手册,android面试试题

前言 组件化是 保持整个 App 可持续地进行高质量开发的基础&#xff0c;近年来也是业界一直在积极探索和实践的方向&#xff0c;在深入理解组件化架构的过程中&#xff0c;将不断考验你的技术深度与广度&#xff1b;实践中我还参考了十几家技术团队的解决方案&#xff08;例如…

智能设备 app 设计 —— 蓝蓝 UI 设计公司

今天给大家推荐是智能设备app设计&#xff0c;随着智能设备的逐渐普及随之操作app也越来越多&#xff0c;希望能给大家带来灵感 #日常灵感 #创意设计#UI提升#ui设计#app #设计案例分享|#设计 #产品设计#产品设计#设计灵感 #B端产品经理 #ui #产品 #美工 #交互 #产品经理 #开发 …

android实战视频教程,细数Android开发者的艰辛历程

缘起 随着互联网企业的不断发展&#xff0c;产品项目中的模块越来越多&#xff0c;用户体验要求也越来越高&#xff0c;想实现小步快跑、快速迭代的目的越来越难&#xff0c;还有应用之间的互相调用等等问题&#xff0c;插件化技术应用而生。如果没有插件化技术&#xff0c;美…

64位Office API声明语句第116讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

Qt插件之输入法插件的构建和使用(一)

文章目录 输入法概述输入法插件实现及调用输入键盘搭建定义样式自定义按钮实现自定义可拖动标签数字符号键盘候选显示控件滑动控件手绘输入控件输入法概述 常见的输入法有三种形式: 1.系统级输入法 2.普通程序输入法 3.程序自带的输入法 系统级输入法就是咱们通常意义上的输入…

普中51单片机学习(AD转换)

AD转换 分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位&#xff0c;或者说分辨率为满刻度的1/(2^12)。 一个10V满刻度的12位ADC能分辨输入电压变化最小值是10V1/(2^12 )2.4mV。 量化误差 …

C++ 哈希表OJ

目录 1、1. 两数之和 2、面试题 01.02. 判定是否互为字符重排 3、217. 存在重复元素 4、 219. 存在重复元素 II 5、49. 字母异位词分组 频繁查找某一个数的时候可以使用哈希表&#xff0c;哈希表可以使用容器&#xff0c;也可以使用数组模拟&#xff0c;当元素是字符串中的字…

8、Linux驱动开发:驱动-读写接口实现(readwrite)

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

npm 私服以及使用

在工作中&#xff0c;公司有很多内部的包并不希望发布到npm官网仓库&#xff0c;因为可能涉及到一些私有代码不能暴露。对于前端来讲&#xff0c;这时就可以选择在公司内网搭建npm私有仓库。当前比较主流的几种解决方案&#xff1a;verdaccio、nexus、cnpm。大家可以按照自己的…

MongoDB Helloworld For Window

1. 下载MongoDB Download MongoDB Community Server | MongoDB 2. 安装MongoDB 3. 创建DB. 4. 用java code 连接mongo. 做增删改查操作。 pom.xml <dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId>&…

Frida-Hook-Java层操作大全

附件下载 https://github.com/DERE-ad2001/Frida-Labs 前期准备 使用 jadx 进行逆向工程的基础知识。应具备理解 Java 代码的能力。具备编写小型 JavaScript 代码片段的能力。熟悉 adb。设备已 root。Frida环境配置 Hook&#xff08;Hooking&#xff09;简介 让我们从非常…

IPsec VPN协议框架

IPsec是IETF&#xff08;Internet Engineering Task Force&#xff09;制定的一组开放的网络安全协议。它并不是一个单独的协议&#xff0c;而是一系列为IP网络提供安全性的协议和服务的集合&#xff0c;包括认证头AH&#xff08;Authentication Header&#xff09;和封装安全载…

dolphinscheduler海豚调度(五)seatunnel案例

seatunnel作为新一代流行的数据集成工具&#xff0c;其功能非常强大且简单易用&#xff0c;今天演示一下如何通过dolphinscheduler创建并运行seatunnel任务 本次dolphinscheduler和seatunnel均部署在同一机器上的单机版本 1、环境配置 打开dolphinscheduler安装目录&#xf…

【Python】新手入门(6):变量与数据类型

【Python】新手入门&#xff08;6&#xff09;&#xff1a;变量与数据类型 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

Java多线程——synchronized、volatile 保障可见性

目录 引出synchronized、volatile 保障可见性Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——synchronized、volatile 保障可见性 synchronized、volatile 保障可见性 原子性&#xff1a;在一次或者多次操作时…

嵌入式学习-FreeRTOS-Day1

一、重点 1、VCC和GND VCC&#xff1a; 1、电路中为电源&#xff0c;供应电压 2、3.3v-5v 3、数字信号中用1表示GND&#xff1a; 1、表示地线 2、一般为0v 3、数字信号中用0表示2、电容和电阻 电容 存储电荷 存储能量&#xff1a; 电容器可以在其两个导体板&#xff08;极…

03.axios数据提交和错误处理

一.axios常用请求方法和数据提交 1. 想要提交数据&#xff0c;先来了解什么是请求方法 请求方法是一些固定单词的英文&#xff0c;例如&#xff1a;GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE&#xff0c;PATCH&#xff08;这些都是http协议规定的&#xff09;&am…