C++ -string -常见用法5

博客主页:【夜泉_ly】
本文专栏:【C++】
欢迎点赞👍收藏⭐关注❤️

在这里插入图片描述

文章目录

  • 💡前言
  • 💡非成员函数
    • 1.operator+
      • 1.1函数原型
      • 1.2使用
      • 1.3注意
    • 2.relational operators
    • 3.swap
    • 4.operator>>
    • 5.operator<<
    • 6.operator<<
  • 💡转换
    • 1.sto...
    • 2.to_string

💡前言

在这篇文章中,我将继续简单探讨 C++string 的基本用法。写这篇文章的主要目的是帮助我巩固所学的知识,同时也便于未来的复习和参考。

如果你想大致的了解 string 的基本用法,也可以留下来看看。

对于那些希望深入学习更多细节的读者,可以去看看这个网站:cplusplus.com,以获取更全面的参考资料。

💡非成员函数

1.operator+

1.1函数原型

string operator+ (const string& lhs, const string& rhs);
string operator+ (const string& lhs, const char*   rhs);
string operator+ (const char*   lhs, const string& rhs);
string operator+ (const string& lhs, char          rhs);
string operator+ (char          lhs, const string& rhs);

1.2使用

可以将一个 字符串 和 一个 字符串/字符数组/字符 拼成一个字符串。
例如:

void Test()
{
	string str("Hello World!");
	string str1 = str.substr(0, str.find(' ')) + str.substr(str.find(' ') + 1); // HelloWorld!
	string str2 = str1 + "!"; // HelloWorld!!
	string str3 = str2 + '!'; // HelloWorld!!!
	cout << str1 << endl;
	cout << str2 << endl;
	cout << str3 << endl;
}

Output :

HelloWorld!
HelloWorld!!
HelloWorld!!!

1.3注意

未定义行为也是有的:

void Test()
{
	string str("HelloWorld!");
	char ch[3] = { '6','6','6' }; // 未以'\0'结尾的字符数组
	string str4 = str1 + ch;
	cout << str4 << endl;
}

在这里插入图片描述

2.relational operators

关系运算符重载:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注,这些函数底层调用的都是string::compare
如,operator<
在这里插入图片描述
再比如operator>=:(先调operator<,再调compare)
在这里插入图片描述

3.swap

这个函数提供了一种高效的方式来交换字符串对象的内容,通过优化内部数据的所有权转移,减少了不必要的内存操作,使得交换操作更为高效。

在这里插入图片描述

  1. 交换字符串的值

    • 该函数的主要功能是交换两个字符串对象的值。调用此函数后,原来在 x 中的字符串值将转移到 y 中,反之亦然。
  2. 重载的 swap 函数

    • swap 是一个常见的算法,通常用于交换两个变量的值。这里提到的重载意味着这个函数的实现可能针对字符串对象进行了优化,使得它能更高效地进行值的交换。
  3. 性能优化

    • 通过交换字符串的内部数据的所有权,而不是逐字符复制,函数能显著提高性能。这种方法称为“移动语义”(move semantics),允许两个字符串对象仅仅交换它们的数据引用,而不是复制所有的字符数据。这样做的好处是减少了内存的使用和时间开销。
  4. 行为类似于 x.swap(y)

    • 这个函数的行为类似于直接调用 x.swap(y),这意味着在使用该函数后,两个字符串的内容将被有效交换,而不涉及实际的数据复制,从而进一步提高效率。

4.operator>>

这个函数通过重载操作符 >> 提供了一种简洁的方式,从输入流中提取字符串对象的内容。它使得字符串的输入变得直观,并且通过动态添加字符来构建字符串。同时,注意到提取操作的限制是只能提取单个单词,这在处理输入时需要加以考虑。

在这里插入图片描述

  1. 提取字符串

    • 该函数的作用是从输入流中提取字符,并将这些字符存储到一个字符串对象中。提取时,之前字符串中的内容会被新的字符序列替换。
  2. 重载操作符 >>

    • 在 C++ 中,操作符 >> 通常用于从输入流中读取数据。通过重载该操作符,字符串对象可以使用 >> 来接收输入,方便用户从流中读取字符串内容。
  3. 字符追加

    • 每当从流中提取一个字符时,都会使用 push_back 方法将该字符追加到字符串对象中。这意味着字符串对象会动态地增长以容纳新字符。
  4. 使用空白字符作为分隔符

    • 输入流的提取操作默认使用空白字符(如空格、制表符和换行符)作为分隔符,这意味着该操作仅提取一个“单词”。如果用户希望读取整行文本,可以使用 getline 函数,这样可以读取到包括空格在内的整行内容。

5.operator<<

这个函数通过重载操作符 << 提供了一种简单而直观的方式,将字符串对象的内容插入到输出流中。这种方式增强了字符串对象的可用性,使得它们可以与流操作(如打印到控制台或写入文件)无缝配合。
在这里插入图片描述

  1. 插入字符串

    • 该函数的作用是将一个字符串对象的内容(即字符序列)插入到输出流中,例如标准输出流 std::cout 或文件输出流。
  2. 重载操作符 <<

    • 在 C++ 中,操作符 << 通常用于将数据输出到流中。通过重载该操作符,字符串对象可以像基本数据类型(如整数或浮点数)一样,方便地使用 << 进行输出。
  3. 与 C 字符串的相似性

    • 该重载的实现模仿了 ostream::operator<< 在处理 C 风格字符串(即以 null 结尾的字符数组)时的行为。这意味着用户在使用 << 操作符输出字符串对象时,不需要进行额外的转换,使用起来非常简便。
    • 需注意的是,与直接处理C风格的字符串还是有点区别的,比如这里不会遇到’\0’就停止:
      string str("Hello");
      str+='\0';
      str+="World";
      cout << str << endl;
      
      Output :
      HelloWorld
      

6.operator<<

可以读空白字符!

这个函数提供了一种方便的方式,从输入流中提取一行字符并将其存储到字符串对象中。通过处理分隔符和确保安全提取,它增强了字符串的输入能力,使得读取用户输入或文件内容变得更加灵活。
在这里插入图片描述

  1. 提取一行字符

    • 该函数的主要作用是从输入流中提取字符,直到遇到指定的分隔符或换行符,将提取的字符存储到字符串中。
  2. 处理结束条件

    • 提取操作会在达到流的末尾(EOF)时停止,也会在输入过程中出现任何错误时停止。这种安全性确保了程序的健壮性。
  3. 分隔符的处理

    • 如果在提取过程中遇到了指定的分隔符,该分隔符会被提取并丢弃,这意味着它不会被存储到字符串中,下一次的输入操作将会在分隔符之后开始。
  4. 替换现有内容

    • 在调用该函数之前,字符串 str 中的内容会被新提取的字符序列替换,这使得 str 始终保存最新的提取结果。
  5. 字符追加

    • 每个提取的字符会通过调用 push_back 方法被追加到字符串对象中,这样可以动态地构建字符串。

💡转换

string类提供了一系列函数进行类型转换。

1.sto…

用于将字符串转换为数字类型,涵盖了多种整数和浮点数类型。

  •   int stoi (const string&  str, size_t* idx = 0, int base = 10);
    
    • 将字符串 str 转换为 int 类型。
    • idx 是可选参数,用于指向转换后未处理部分的索引。
    • base 指定转换的进制,默认为十进制(10)。
  • long stol (const string&  str, size_t* idx = 0, int base = 10);
    
    • 将字符串 str 转换为 long 类型。
    • stoi 相似,支持进制和未处理部分的索引。
  • unsigned long stoul (const string&  str, size_t* idx = 0, int base = 10);
    
    • 将字符串 str 转换为无符号长整型 unsigned long
  • long long stoll (const string&  str, size_t* idx = 0, int base = 10);
    
    unsigned long long stoull (const string&  str, size_t* idx = 0, int base = 10);
    
    float stof (const string&  str, size_t* idx = 0);
    
    double stod (const string&  str, size_t* idx = 0);
    
    long double stold (const string&  str, size_t* idx = 0);
    
    • 这几个与上面类似。

在使用这些函数时,应确保输入字符串的格式正确,否则可能会抛出异常或返回不确定的值。

2.to_string

to_string 函数用于将各种基本数据类型转换为 string 类型,具体函数如下:

  • string to_string(int val);
  • string to_string(long val);
  • string to_string(long long val);
  • string to_string(unsigned val);
  • string to_string(unsigned long val);
  • string to_string(unsigned long long val);
  • string to_string(float val);
  • string to_string(double val);
  • string to_string(long double val);


在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

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

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

相关文章

Javascript算法(滑块窗口、螺旋矩阵)

滑块窗口 JS滑块窗口算法&#xff0c;即滑动窗口算法&#xff08;Sliding Window&#xff09;&#xff0c;在JavaScript中的应用场景主要集中在处理字符串和数组等数据结构中的子串或子数组问题。这种算法通过维护一个窗口&#xff0c;并移动窗口的两个边界&#xff08;左右指…

Linux命令进阶·vi\vim编辑器详细命令介绍

目录 1. 什么是 vim&#xff1f; 2. vi\vim 模式介绍 2.1 命令模式&#xff08;Command mode&#xff09; 2.2 输入模式&#xff08;Insert mode&#xff09; 2.3 底线命令模式&#xff08;Last line mode&#xff09; 3. vi\vim 的使用 4. 命令介绍 1. 什么是 …

微信小程序-自定义组件

文章目录 微信小程序-自定义组件概述创建和使用数据、方法和属性slot 插槽默认插槽具名插槽 组件样式注意项样式隔离 数据监听组件间通信父传子子传父获取子组件实例 生命周期组件的生命周期组件所在页面的生命周期App、Page与Component生命周期对比冷启动保留当前页面和关闭当…

诺奖印证产业方向,AI先行者晶泰科技开拓黄金赛道

2024年诺贝尔奖揭晓的各奖项中&#xff0c;AI领域无疑成为“最大赢家”。 从诺贝尔物理学奖被授予两名AI科学家&#xff0c;到诺贝尔化学奖表彰三位科学家“用人工智能&#xff08;AI&#xff09;破译蛋白质的密码”&#xff0c;本届诺贝尔奖“含AI量”之高引起市场热议。 值…

如何将 Elasticsearch 与流行的 Ruby 工具结合使用

作者&#xff1a;来自 Elastic Fernando Briano 了解如何将 Elasticsearch 与一些流行的 Ruby 库一起使用。 在这篇博文中&#xff0c;我们将介绍如何将 Elasticsearch 与一些流行的 Ruby 工具结合使用。我们将实现 Ruby 客户端 “入门”指南 中介绍的常用 API。如果你点击该链…

【从零开发Mybatis】引入XNode和XPathParser

引言 在上文&#xff0c;我们发现直接使用 DOM库去解析XML 配置文件&#xff0c;非常复杂&#xff0c;也很不方便&#xff0c;需要编写大量的重复代码来处理 XML 文件的读取和解析&#xff0c;代码可读性以及可维护性相当差&#xff0c;使用起来非常不灵活。 因此&#xff0c…

深度学习:对评论信息的情感分析,建立模型,自动识别评论信息的情绪状态完整代码实现

评论 思考&#xff1a;向模型中传递数据时&#xff0c;需要提前处理好数据 1、目标&#xff1a;将评论内容转换为词向量。 2、每个词/字转换为词向量长度(维度)200 3、每一次传入的词/字的个数是否就是评论的长度? 应该是固定长度&#xff0c;每次传入数据与图像相似…

DIY我的世界磁力方块

引子 小朋友喜欢我的世界&#xff0c;就像当年我那代对俄罗斯方块的执着&#xff0c;考虑电子游戏伤眼睛&#xff0c;所以最近开始给小朋友买磁力方块。 一个将近1元多的价格&#xff0c;催生我DIY的念头。 正文 Freecad图&#xff0c;A,B,C,D处 放磁铁 5.14g 材料费 最后的成…

Axure中继器单选、多选和重置

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure中继器单选、多选和重置 主要内容&#xff1a;根据查询条件&#xff0c;通过单选、多选和重置&#xff0c;从中继器中得到数据 应用场景&…

DockerCompose快速部署Java项目、nginx前端和mysql数据库到centos虚拟机

简介&#xff1a;整理自&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09;课程的飞书文档。 DockerCompose介绍 大家可以看到&#xff0c;我们部署一个简单的java项…

stm32实现esp8266连接到TCP服务器(二)未完

1.2 连接到TCP Server 1.2.1 使用网络助手&#xff0c;设立TCP服务器 ​ 编辑 1.2.2 连接服务器 ATCIPSTART"TCP","192.168.1.18",8080 //指令&#xff0c;注意双引号逗号都要半角(英文)输入 CONNECT //结果&#xff1a;成功 OK //结果&#xff1a;成功 …

[C++]ecplise C++新建项目跑hello world

测试通过版本&#xff1a; ecplise-cpp 2024-09 ecplise-cpp 2020-09 【前提】 安装好MinGW环境&#xff0c;实际测试不需要下载什么CDT插件就可以运行了。 步骤&#xff1a; &#xff08;1&#xff09;打开ecplise,选择launch 选择File->New->C/C Project 选择C M…

Java_数组的使用

一、数组的介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数&#xff08;数据&#xff09;组&#xff08;一组&#xff09;就是一组数据 二、代码演示 public class Array01 {public static void main(String[] args) …

DMAIC赋能智能家居:解锁未来生活新篇章!

从清晨自动拉开的窗帘&#xff0c;到夜晚自动调暗的灯光&#xff0c;每一处细节都透露着科技的温度与智慧的光芒。而在这场智能革命的浪潮中&#xff0c;DMAIC&#xff08;定义Define、测量Measure、分析Analyze、改进Improve、控制Control&#xff09;作为六西格玛管理的核心方…

React之组件渲染性能优化

关键词&#xff1a; shouldComponentUpdate、PureComnent、React.memo、useMemo、useCallback shouldComponentUpdate 与 PureComnent shouldComponentUpdate 与 PureComnent 用于类组件。虽然官方推荐使用函数组件&#xff0c;但我们依然需要对类组件的渲染优化策略有所了解…

10 排序算法:冒泡排序与快速排序(算法原理、算法实现、时间和空间复杂度分析)

目录 1 十大常见的排序算法 1.1 算法的稳定性 2 冒泡排序 2.1 算法原理 2.2 算法实现 2.3 时间空间复杂度分析 2.3.1 时间复杂度分析 2.3.2 空间复杂度分析 3 快速排序 3.1 算法原理 3.1.1 排序思想 3.1.2 递归过程 3.2 示例 3.2.1 示例 1 3.2.2 示例 2 3.2.3 …

RHCE--网络服务

第一章 例行性工作 1、单一执行的例行性工作&#xff08;at&#xff09; 1.1 查看at命令 at的黑名单&#xff08;deny&#xff09;、白名单&#xff08;allow&#xff09;&#xff1b;两个文件若都不存在则只有root用户能使用 at工作调度对应的系统服务 atd&#xff1a;at的…

N9305高品质mp3音频语音芯片ic在早教故事机的应用方案

随着人们对教育的重视程度不断提高&#xff0c;儿童早教机已经成为了很多家庭的教育必备品。N9305音乐芯片在早教故事机中的应用&#xff0c;不仅为孩子们带来了丰富多彩的故事世界&#xff0c;还以其卓越的音质表现和功能&#xff0c;进一步提升了早教体验。 九芯电子N9305高品…

单片机——ADC采样

1、什么是ADC采样&#xff1f; ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压&#xff0c;通过数值的方式表现出来。以STM32F103系列为例&#xff0c;它可以反应0~4095&#xff0c;换句话说&#xff0c;它采集的电压数值上表现为0~4095&#xf…

前端文件流导出

1、前端代码 ​ /** 导出 */ const handleExport async () > {let config {responseType: blob,headers: {Content-Type: application/json,},};const res await getTargetExport(config);const blob new Blob([res]);const fileName PK目标跟进导出列表.xls;const li…