【C++】标准库中的string类

目录

一、介绍

二、常用接口

1.构造函数和赋值操作

2.string类对象的容量操作

3.string类对象的访问及遍历操作

4.string类对象的修改操作

5.string类非成员函数

放在最后


一、介绍

在C++中,std::string 是标准库提供的字符串类。它属于 <string> 头文件,并为处理字符串提供了一套丰富的功能和方法。std::string 是一个动态数组类,它能够自动调整大小,提供了许多便利的成员函数用于字符串的操作和处理。下面是string类的常用操作:

  1. 动态大小: std::string 类能够自动调整大小,不需要手动管理内存,这使得字符串的使用更为方便。

  2. 成员函数: std::string 提供了丰富的成员函数,包括字符串的连接、截取、查找、替换、比较等操作。

  3. 访问字符: 通过索引、迭代器等方式可以访问和修改字符串中的字符。

  4. 输入输出: 可以使用流操作符 <<>> 进行字符串的输入和输出。

  5. 构造函数: std::string 支持多种构造函数,包括默认构造函数、接受 C 风格字符串的构造函数、拷贝构造函数等。

  6. 常用算法: 提供了一些常用的算法,比如字符串查找、替换等。

  7. 内存管理: std::string 负责管理字符串的内存,避免了手动内存管理的麻烦。

二、常用接口

1.构造函数和赋值操作

  • 默认构造函数: std::string()
  • 带字符串参数的构造函数: std::string(const char* s)
  • 拷贝构造函数: std::string(const std::string& str)
  • 赋值操作符: operator=, assign

代码实例:

#include <iostream>
#include <string>
using namespace std;int main() {// 默认构造函数std::string str1;// 带字符串参数的构造函数std::string str2 = "Hello, World!";// 拷贝构造函数std::string str3 = str2;// 赋值操作std::string str4;str4 = "World, Hello!";std::cout << str1 << std::endl;std::cout << str2 << std::endl;std::cout << str3 << std::endl;std::cout << str4 << std::endl;return 0;
}

输出:

2.string类对象的容量操作

  • length 方法: 返回字符串的长度
  • size 方法: 返回字符串的大小(长度)
  • capacity 方法:返回空间总大小
  • empty 方法:检测字符串释放为空串,是返回true,否则返回false
  • clear 方法:清空有效字符
  • reverse 方法:为字符串预留空间
  • resive 方法:将有效字符的个数该成n个,多出的空间用字符c填充

代码实例:

#include <iostream>
#include <string>int main() {std::string myString = "Hello, World!";// length 方法:返回字符串的长度std::cout << "Length: " << myString.length() << std::endl;// size 方法:返回字符串的大小(长度)std::cout << "Size: " << myString.size() << std::endl;// capacity 方法:返回空间总大小std::cout << "Capacity: " << myString.capacity() << std::endl;// empty 方法:检测字符串是否为空串std::cout << "Is empty? " << (myString.empty() ? "Yes" : "No") << std::endl;// clear 方法:清空有效字符myString.clear();std::cout << "After clear: " << myString << std::endl;// reverse 方法:为字符串预留空间myString.reserve(20);std::cout << "After reserving space: " << myString << std::endl;// resize 方法:将有效字符的个数修改为 n 个,多出的空间用字符 'X' 填充myString.resize(10, 'X');std::cout << "After resizing: " << myString << std::endl;return 0;
}

输出:

 

3.string类对象的访问及遍历操作

  • operator[] 返回pos位置的字符,const string类对象调用
  • begin + end: begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
  • rbegin + rend:rbegin获取最后一个字符的迭代器 + end获取第一个字符前一个位置的迭代器
  • 范围 for:C++11支持更简洁的范围for的新遍历方式

代码实例:

#include <iostream>
#include <string>int main() {const std::string myString = "Hello, World!";// operator[]:返回 pos 位置的字符,const string 类对象调用char character = myString[7];std::cout << "Character at position 7: " << character << std::endl;// begin + end:begin 获取第一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器std::cout << "Using begin() and end() to iterate:" << std::endl;for (auto it = myString.begin(); it != myString.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// rbegin + rend:rbegin 获取最后一个字符的迭代器 + end 获取第一个字符前一个位置的迭代器std::cout << "Using rbegin() and rend() to iterate in reverse:" << std::endl;for (auto it = myString.rbegin(); it != myString.rend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 范围 for 循环:C++11 支持更简洁的范围 for 的新遍历方式std::cout << "Using range-based for loop:" << std::endl;for (char c : myString) {std::cout << c << " ";}std::cout << std::endl;return 0;
}

输出:

 

4.string类对象的修改操作

  • push back:在字符串后尾插字符c
  • append:在字符串后追加一个字符串
  • operator +=:在字符串后追加字符串str
  • c_str:返回C格式字符串
  • find + npos:从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
  • rfind:从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
  • substr:在str中从pos位置开始,截取n个字符,然后将其返回

​​​​​​​代码实例:

#include <iostream>
#include <string>int main() {std::string myString = "Hello, ";// push_back:在字符串后尾插字符 'C'myString.push_back('C');std::cout << "After push_back: " << myString << std::endl;// append:在字符串后追加一个字符串myString.append("World!");std::cout << "After append: " << myString << std::endl;// operator +=:在字符串后追加字符串 " Welcome!"myString += " Welcome!";std::cout << "After operator +=: " << myString << std::endl;// c_str:返回 C 格式字符串const char* cStr = myString.c_str();std::cout << "C-style string: " << cStr << std::endl;// find + npos:从字符串位置 7 开始往后找字符 'o',返回该字符在字符串中的位置size_t pos = myString.find('o', 7);if (pos != std::string::npos) {std::cout << "Found 'o' at position: " << pos << std::endl;} else {std::cout << "'o' not found." << std::endl;}// rfind:从字符串位置 7 开始往前找字符 'o',返回该字符在字符串中的位置size_t rpos = myString.rfind('o', 7);if (rpos != std::string::npos) {std::cout << "Found last 'o' at position: " << rpos << std::endl;} else {std::cout << "Last 'o' not found." << std::endl;}// substr:在字符串中从位置 7 开始截取 5 个字符,然后将其返回std::string substr = myString.substr(7, 5);std::cout << "Substring: " << substr << std::endl;return 0;
}

 输出:

5.string类非成员函数

  • operator+传值返回,导致深拷贝效率低(少用)
  • operator>>:输入运算符重载
  • operator<<:输出运算符重载
  • getline:获取一行字符串
  • relational operators:大小比较

代码实例:

#include <iostream>
#include <string>int main() {// operator+:传值返回,导致深拷贝效率低(少用)std::string str1 = "Hello, ";std::string str2 = "World!";std::string result = str1 + str2;  // 使用 operator+ 进行字符串连接std::cout << "Concatenated string: " << result << std::endl;// operator>>:输入运算符重载std::string inputString;std::cout << "Enter a string: ";std::cin >> inputString;std::cout << "You entered: " << inputString << std::endl;// operator<<:输出运算符重载std::string outputString = "Output this string!";std::cout << "Output using operator<<: " << outputString << std::endl;// getline:获取一行字符串std::string line;std::cout << "Enter a line of text: ";std::getline(std::cin, line);std::cout << "You entered: " << line << std::endl;// relational operators:大小比较std::string str3 = "apple";std::string str4 = "banana";if (str3 == str4) {std::cout << "Strings are equal." << std::endl;} else if (str3 < str4) {std::cout << "str3 is less than str4." << std::endl;} else {std::cout << "str3 is greater than str4." << std::endl;}return 0;
}

输出:

 

放在最后

以上只是对string类的初步认识,想要继续深入了解它还需要经过大量的练习以及string类的自我实现,理解了它的底层原理才能更好地运用它,后续我也会继续推出有关string类的自我实现的博客,请期待一波~~

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

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

相关文章

ROS机器人入门

http://www.autolabor.com.cn/book/ROSTutorials/ 1、ROS简介 ROS 是一个适用于机器人的开源的元操作系统。其实它并不是一个真正的操作系统&#xff0c;其 底层的任务调度、编译、寻址等任务还是由 Linux 操作系统完成&#xff0c;也就是说 ROS 实际上是运 行在 Linux 上的次级…

MySQL主从复制详解

目录 1. 主从复制的工作原理 1.1. 主从复制的角色 1.2. 主从复制的流程 2. 配置MySQL主从复制 2.1. 确保主服务器开启二进制日志 2.2. 设置从服务器 2.3. 连接主从服务器 2.4. 启动复制 3. 主从复制的优化与注意事项 3.1. 优化复制性能 3.2. 注意复制延迟 3.3. 处理…

买显卡别再只看N、A两家了,这些高性价比I卡也很香

谈起独立显卡&#xff0c;相信不少朋友都会第一时间想起NVIDIA与AMD这两家巨头。然而&#xff0c;除了这两家巨头以外&#xff0c;凭借集显占据全球最高显卡市场份额的英特尔在2021年正式入局了独显市场&#xff0c;并在去年9月的时候公布了Arc A系列显卡阵容&#xff0c;型号从…

算法——动态规划(DP,Dynamic Programming)

一、基础概念 DP的思想&#xff1a; 把问题分成子问题&#xff0c;前面子问题的解决结果被后面的子问题使用DP与分治法的区别&#xff1a; 分治法把问题分成独立的子问题&#xff0c;各个子问题能独立解决 自顶向下DP前面子问题的解决结果被后面的子问题使用&#xff0c;子问题…

【基于APB总线的DES实现】

基于APB总线的DES实现 本文内容摘要APB介绍仿真结果整体仿真写入数据DES加密部分DES加密读出密文 整体代码 本文内容摘要 本文是设计一个可兼容APB总线的DES加密协处理器&#xff0c;用来将DES加密模块与APB总线进行对接&#xff0c;使总线发送来的数据可以正常写入并进行加密后…

Autosar DEM DTC的Debounce策略

文章目录 简介Debounce策略1、基于计数器的 Debounce 策略2、基于时间的Debounce策略 简介 故障事件防抖&#xff0c;与按键防抖&#xff08;软件需要延时确认按键不是误触发&#xff09;的作用类似&#xff0c;目的是为了防止事件误触发采取的策略。 因为DTC并不是一达到触发…

产品调研——AI平台

本文主要记录了对腾讯云-TIONE平台、华为云-ModelArt等主流AI平台的产品调研。 交互式建模 简单点说就是提供了带训练资源的云IDE&#xff0c;使用形态包括Notebook、VsCode等。 腾讯云-TI平台 TI平台将tensorflow、pytorch、spark环境等均集成到一个Notebook容器中&#xf…

Android 一分钟使用RecyclerView完美实现瀑布

【免费】安卓RecyclerView瀑布流效果实现资源-CSDN文库 1.WaterfallFlowActivity 主函数代码&#xff1a; package com.example.mytestapplication;import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.widget.Toast;im…

Git总结 | Git面试都问些啥?

什么是Git为什么要用Git等等这些相信看到该标题点进来的同学也不希望浪费时间再看一遍&#xff0c;那么直接进入主题&#xff0c;对于日常工作中常用的Git相关操作进行整理&#xff0c;一起看看吧 面试官&#xff1a;你常用的Git操作是什么? 候选人&#xff1a;git clone 面试…

59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。 题目描述如下&#xff1a; 首先拿到这道题&#xff0c;首先不要慌张&#xff0c;我们来仔细分析一下会发现并没有那么难。 首先看下边界的元素是1、2、3递增的&#xff0c;那么我们也许可以根据这一点先把边界的元素一个一个给…

【Proteus仿真】【51单片机】视力保护仪

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使LCD1602液晶&#xff0c;按键、HC-SR04超声波、PCF8591 ADC、光敏传感器、蜂鸣器、LED等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示…

【vtkWidgetRepresentation】第十四期 二维标注

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtk中的二维标注,主要用于医学领域,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. vtkBiDimension…

漏洞复现-海康威视 NCG 联网网关 login.php 目录遍历漏漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

Day64力扣打卡

打卡记录 方格取数&#xff08;线性DP&#xff09; import sys input sys.stdin.readline 输入样例&#xff1a; 8 2 3 13 2 6 6 3 5 7 4 4 14 5 2 21 5 6 4 6 3 15 7 2 14 0 0 0 输出样例&#xff1a; 67 n int(input()) w [[0] * (n 1) for _ in range(n 1)] while Tru…

精选硬件连通性测试工具:企业如何做出明智选择

在当今数字化的商业环境中&#xff0c;企业的硬件连通性至关重要。选择适用的硬件连通性测试工具是确保网络和设备协同工作的关键一步。本文将探讨企业在选择硬件连通性测试工具时应考虑的关键因素&#xff0c;以帮助其做出明智的决策。 1. 功能全面性&#xff1a;首要考虑因素…

Android开发——组合函数、注解与连接Android设备

1、JetPack Compose、组合函数与注解和文本修改 1、JetPack Compose&#xff1a;Jetpack Compose 是由 Google 推出的用于构建 Android 用户界面的现代化工具包。它是一个声明式的 UI 工具包&#xff0c;用于简化 Android 应用程序的用户界面设计和开发。Jetpack Compose 采用…

C语言精选练习题:(11)打印菱形

文章目录 每日一言题目思路代码结语 每日一言 Intelligence without ambition is a bird without wings. 聪明但没有抱负&#xff0c;就像没有翅膀的鸟。 题目 输入一个整数n&#xff0c;打印对应2n-1行的菱形图案&#xff0c;比如输入7&#xff0c;图案一共13行 1 …

Stable Diffusion - High-Resolution Image Synthesis with Latent Diffusion Models

Paper name High-Resolution Image Synthesis with Latent Diffusion Models Paper Reading Note Paper URL: https://arxiv.org/abs/2112.10752 Code URL: https://github.com/CompVis/latent-diffusion TL;DR 2021 年 runway 和慕尼黑路德维希马克西米利安大学出品的文…

全球移动通信(2G/3G/4G/5G)频谱分布情况

一、概述 随着通信技术的不断发展&#xff0c;全球各国都在积极推进2G、3G、4G、5G网络的建设和应用。根据FCC统计&#xff0c;目前全球移动通信频谱分布如下&#xff1a; 二、分布 &#xff08;一&#xff09;俄罗斯 2G&#xff1a;主要使用900MHz和1800MHz两个频段。其中&…

【sqli靶场】第六关和第七关通关思路

目录 前言 一、sqli靶场第六关 1.1 判断注入类型 1.2 观察报错 1.3 使用extractvalue函数报错 1.4 爆出数据库中的表名 二、sqli靶场第七关 1.1 判断注入类型 1.2 判断数据表中的字段数 1.3 提示 1.4 构造poc爆库名 1.5 构造poc爆表名 1.6 构造poc爆字段名 1.7 构造poc获取账…