【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.hqwc.cn/news/284637.html

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

相关文章

(已解决)如何使用matplotlib绘制小提琴图

网上很多人使用seaborn绘制小提琴图&#xff0c;本人暂时不想学新的东西&#xff0c;就是懒。本文介绍如何使用matplotlib绘制小提琴图&#xff0c;很多其他博客只是使用最简单的语法&#xff0c;默认小提琴颜色会是蓝色&#xff0c;根本改不了。本文使用了一点高级的用法&…

干涉光学测试导论

1.用于光学测试的基本干涉仪 2。相移干涉术 3。专业光学测试 4。长波长干涉术 5。非球面试验 6。表面微观结构的测量 7。绝对测量 8。结束语 第1部分-光学测试用基本干涉仪 (1)双光束干涉 (2)菲佐干涉仪和特维曼-格林干涉仪 (3)测试平面和球面的基本技术 (4)球面的基本…

【C语言】cache和程序访问的局部性对程序性能的影响

文章目录 1&#xff0e;源程序比较其性能影响2&#xff0e;内存分配&#xff08;1&#xff09;静态存储区&#xff08;static&#xff09;&#xff1a;&#xff08;2&#xff09;栈区&#xff08;stack&#xff09;&#xff1a;&#xff08;3&#xff09;堆区&#xff08;heap&…

开源学习项目推荐

文章目录 koodo-reader凤凰架构学习项目NPS 内网穿透客户端 koodo-reader 项目地址&#xff1a;https://github.com/koodo-reader/koodo-reader 介绍&#xff1a;一个开源的阅读器&#xff0c;阅读pdf也有目录&#xff0c;作为epub阅读器和pdf阅读器看资料挺好 凤凰架构 项…

c语言:[输出函数]与[输入函数]|要点简述

一、【输出函数】 printf() 与 puts()的不同点 1、printf()函数 printf()支持单个字符%c的输出&#xff0c;以及字符串%s的输出。 (1)如果是以%c的形式输出&#xff0c;是一个字符一个字符的输出。因此&#xff0c;要用一个循环语句&#xff0c;把字符逐个输出。 (2)而用%…

Opus编解码器中音乐检测的奥秘

Opus是一个有损音频压缩的数字音频编码格式&#xff0c;由Xiph.Org基金会开发&#xff0c;之后由互联网工程任务组&#xff08;IETF&#xff09;进行标准化&#xff0c;目标是希望用单一格式包含声音和语音&#xff0c;取代Speex和Vorbis&#xff0c;且适用于网络上低延迟的即时…

Polynomial(Linear) Regression 多项式线性回归

介绍&#xff1a; 多项式线性回归是一种线性回归的扩展&#xff0c;它允许我们在模型中使用多项式函数来拟合数据。 线性回归模型假设因变量与自变量之间存在线性关系&#xff0c;即通过一个直线来拟合数据。但是&#xff0c;在某些情况下&#xff0c;数据可能不适合使用直线…

03 使用Vite开发Vue3项目

概述 要使用vite创建Vue3项目&#xff0c;有很多种方式&#xff0c;如果使用命令&#xff0c;则推荐如下命令&#xff1a; # 使用nvm将nodejs的版本切换到20 nvm use 20# 全局安装yarn npm install -g yarn# 使用yarnvite创建项目 yarn create vite不过&#xff0c;笔者更推荐…

2024年软件测试入坑指南,新人必看系列

本科非计算机专业&#xff0c;在深圳做了四年软件测试工作&#xff0c;从之前的一脸懵的点点点&#xff0c;到现在会点自动化测试&#xff0c;说一点点非计算机专业人员从事软件测试的心得体会&#xff0c;仅供参考交流。 如果你是非计算机专业&#xff0c;毕业不久&#xff0…

排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序

排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序 文章目录 排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序前言&#xff1a;冒泡排序插入排序希尔排序选择排序堆排序快速排序--交换排序三数取中快速排序hoare版本快速排序挖坑法快速排序前后指…

lambda自定义比较规则-sort函数或优先队列

Lambda表达式的一般形式为 [captures](params){body}对于优先队列的自定义排序规则&#xff0c;常见方法是写成结构体形式 struct cmp{bool operator()(pair<int,int> map1,pair<int,int> map2){return map1.second>map2.second;} }; priority_queue<pair&…

【FPGA】电梯楼层显示(简易)

前言 这是作者室友的项目&#xff0c;本来不管作者事儿的&#xff0c;但是后来听到说是室友去网上找人花了80块买了个劣质的&#xff0c;不仅是从CSDN上抄的&#xff0c;而且使用的板子还不符合室友的要求。可叹作者心软啊&#xff0c;顺便给室友做了。 在代码实现部分会给出设…