【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. 处理…

Broken pipe

1. 请解释什么是Broken pipe错误&#xff0c;以及它是如何发生的&#xff1f; Broken pipe错误通常发生在网络编程中&#xff0c;比如在使用socket编程时&#xff0c;当客户端发送了一个请求&#xff0c;但是服务器已经关闭了连接或者在客户端发送数据时&#xff0c;网络连接出…

多进程间通信学习之信号灯集(信号量数组)

信号灯集&#xff08;信号量数组&#xff09;&#xff1a;1、实现进程同步的机制&#xff1b;2、在一个信号灯集中&#xff0c;可以有很多信号灯&#xff1b;3、这些信号灯集中的信号灯相互独立&#xff0c;每个灯的值的改变都不会影响到其他的信号灯&#xff1b;4、信号灯的值…

adb setting设置

设置主页面 adb shell am start com.android.settings/com.android.settings.Settings 安全 adb shell am start com.android.settings/com.android.settings.SecuritySettings 手机无线信息 adb shell am start com.android.settings/com.android.settings.RadioInfo 更…

买显卡别再只看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并不是一达到触发…

65道Go基础高频题整理(附答案背诵)

说明一下Golang 中 make 和 new 的区别&#xff1f; 好的&#xff0c;关于 make 和 new 在 Go 语言中的区别&#xff0c;我来解释一下。 new 函数的作用&#xff1a; new(T) 函数会为 T 类型的新项分配零值内存&#xff0c;并返回其地址&#xff0c;即一个 *T 类型的值&#x…

产品调研——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…

新人学习python必须知道的规范(Python-PEP8)

NOTE(注意): 随着时间的推移&#xff0c;更好的编程方式可能会陆续出现&#xff0c;以下基于PEP8整理总结于2023-12-18. 由于加入了自己的一些见解&#xff0c;所以本文并不是PEP8的翻译版本&#xff0c;所以跟PEP8并不100%相同。其中样例代码只摘取了经典的常见的一部分。 以下…

Bash script进阶笔记

数组类型 arr(1 2 3) # 最基础的方式声明数组&#xff0c;用小括号()&#xff0c;元素之间逗号分隔 arr([1]10 [2]20 [3]30) # 初始化时指定index declare -a arr(1 2 3) # 用declare -a声明数组&#xff0c;小括号外面可选使用单引号、双引号 declare -a arr‘(1 2 3)’…

30道C++ 基础高频题整理(附答案背诵版)

1. C和C有什么区别&#xff1f; C是C语言的超集&#xff08;我看网上很多文章说这是不对的&#xff09;&#xff0c;这意味着几乎所有的C程序都可以在C编译器中编译和运行。然而&#xff0c;C引入了许多新的概念和特性&#xff0c;使得两种语言在一些关键点上有显著的区别。 …