C++ STL之string容器

news2024/10/2 22:31:12

目录

  • 一、C与C++字符串的差别
  • 二、string类对象的容量操作
  • 三、string类中的常见API
    • 总览
    • 1.构造
    • 2.赋值
      • 重载赋值操作符 =
      • 成员函数 assign
    • 3.存取
      • 重载下标获取操作符 [ ]
      • 成员函数 at
    • 4.拼接
      • 重载复合操作符 +=
      • 成员函数 append
    • 5.查找
      • 成员函数 find
      • 成员函数 rfind
      • 成员函数 replace
    • 6.比较
      • 成员函数 compare
      • 重载比较操作符
    • 7.子串
      • 成员函数 substr
    • 8.插入
      • 成员函数 insert
    • 9.删除
      • 成员函数 erase


一、C与C++字符串的差别

  • C语言下的字符串char*是一个指针。
  • C++下的字符串string是一个类,类内部封装了char来管理字符串,是一个char&型的容器。

相比于C语言下以'\0'结尾中间不能含有任何'\0'的字符串,C++的string类的字符串可以存在任何东西,包括'\0'


二、string类对象的容量操作

函数名称功能说明
size返回字符串的有效长度。
length返回字符串的有效字符长度。
capacity返回空间的总大小。
empty检测字符串是否为空串,是返回true,否返回false。
clear清空有效字符。
reserve为字符串预留空间。
resize将有效字符的个数改为n个,多出的空间用字符c填充。

三、string类中的常见API

在编程中,API(Application Programming Interface)是指一组已定义的接口或函数,用于让不同的软件组件之间进行交互和通信,实现不同应用程序之间的互操作性。

总览

引用的头文件#include<string>
string的使用需用到命名空间std

string类中API的总览

1.构造

C++中的string类默认构造函数的字符串初始值是空字符串,即长度为0的字符串。

string();
//默认构造函数,创建一个空的字符串
string(const string& str);
//拷贝构造函数,使用一个string对象初始化另一个string对象
string(const char*s);
//含参构造函数,使用C风格字符串初始化
string(int n, char c);
//含参构造函数,使用n个字符c初始化

代码使用如下:

string s1;//默认构造
string s2(s1);
string s3("Hello World!");
string s4(10, 'a');//用10个'a'来初始化字符串

2.赋值

重载赋值操作符 =

string& operator=(const char* s);
//C风格字符串赋值给当前的字符串
string& operator=(const string& s):
//把字符串s赋给当前的字符串
string& operator=(const char c);
//字符赋值给当前的字符串

代码使用如下:

string s1;
string s2("Hello World!");

s1 = s2;
s1 = "Hello World!";
s1 = 'c';

成员函数 assign

string& assign(const char* s);
//C风格字符串赋值给当前的字符串
string& assign(const char* s, int n);
//把C风格字符串s的前n个字符赋给当前的字符串
string& assign(const string& s);
//把字符串s赋给当前字符串
string& assign(int n, char c);
//把n个字符c赋给当前的字符串
string& assign(const char* s, int pos, int n);
//把C风格字符串s中从start开始的n个字符赋值给当前字符串
string& assign(const string& s, int start, int n);
//将字符串s中从start开始的n个字符赋值给当前字符串
string& assign(const string& s, int start);
//将字符串s中从start开始直至结束的字符赋值给当前字符串

代码使用如下:

string s1;
string s2("Hello World!");

s1.assign("Hello World!");
s1.assign("Hello World!", 5);
s1.assign(s2);
s1.assign(14, 'c');
s1.assign("Hello World!", 6, 3);
s1.assign(s2, 6, 3);
s1.assign(s2, 6);

3.存取

重载下标获取操作符 [ ]

使用下标操作符获取字符时,如果下标越界,程序将会强制终止。

char& operator[](int n);
//通过[]下标方式获取字符

代码使用如下:

string s1("Hello World!");

s1[0];
s1[1];
s1[2];

成员函数 at

使用at方法获取字符时,如果下标越界, at方法内部会抛出异常(exception),可以使用try-catch捕获并处理该异常。

char& at(int n);
//通过at方法获取字符

代码使用如下:

string s1("Hello World!");

s1.at(0);
s1.at(1);
s1.at(2);

使用try-catch捕获并处理该异常:

#include <iostream>
using namespace std;
int main()
{
	string s = "hello world";
	try
	{
		//s[100]不会抛出异常,程序会直接挂掉
		s.at(100);
	}
	catch (out_of_range& e)
		//如果不熟悉异常类型,可以使用多态特性,catch(exception& e)
	{
		cout << e.what() << endl;
		//打印异常信息
	}
	//如果不熟悉异常类型,可以使用多态特性,catch(exception& e)
	return 0;
}

4.拼接

重载复合操作符 +=

string& operator+=(const string& str);
//将字符串str追加到当前字符串末尾
string& operator+=(const char* str);
//将C风格字符数组追加到当前字符串末尾
string& operator+=(const char c);
//将字符c追加到当前字符串末尾

代码使用如下:

string s1;
string s2("Hello World!");

s1 += s2;
s1 += "Hello World!";
s1 += 'a';

成员函数 append

string& append(const char* s);
//把C风格字符数组s连接到当前字符串结尾
string& append(const char* s, int n);
//把C风格字符数组s的前n个字符连接到当前字符串结尾
string& append(const char* s, int pos, int n);
//把C风格字符数组s中从pos开始的n个字符连接到当前字符串结尾
string& append(const string& s);
//将字符串s追加到当前字符串末尾
string& append(const string& s, int pos, int n);
//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(const string& s, int pos);
//将字符串s中从pos开始直至结束的字符连接到当前字符串结尾
string& append(int n, char c);
//在当前字符串结尾添加n个字符c

代码使用如下:

string s1;
string s2("Hello World!");

s1.append("Hello World!");
s1.append("Hello World!", 5);
s1.append("Hello World!", 6, 3);
s1.append(s2);
s1.append(s2, 6, 3);
s1.append(s2, 6);
s1.append(5, 'o');

5.查找

成员函数 find

当查找失败时, find方法会返回-1,-1已经被封装为string的静态成员常量string::nposo

int find(const string& str, int pos = 0) const;
//查找str在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
int find(const char* s, int pos = 0) const;
//查找C风格字符串s在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
int find( const char* s, int pos, int n) const;
//从pos位置查找s的前n个字符在当前字符串中第一次出现的位置
int find(const char c, int pos = 0) const;
//查找字符c第一次出现的位置,从pos开始查找,pos默认为0

成员函数 rfind

rfind(str, pos)的实际的开始位置是pos + str.size(),即从该位置开始 (不包括该位置字符) 向前寻找匹配项,如果有则返回字符串位置,如果没有返回string::npos

int rfind(const string& str, int pos = npos)const;
//在当前字符串中,从pos位置开始查找str的最后一次出现位置
int rfind(const char* s, int pos = npos) const;
//在当前字符串中,从pos位置开始查找s的最后一次出现位置,计数永远是从前往后
int rfind(const char* s, int pos, int n) const;
//从pos位置开始查找前n个字符,找到s最后一次出现的位置
int rfine(const char c, int pos = npos) const;
//在当前字符串中,从pos位置开始查找字符c的最后一次出现位置

关于string::npos
-1其实是size t类的最大值 (补码知识) ,所以string::npos其实表示“直到字符串结束”。

同时,可以发现string::npos和container.end()送代器其实是相同含义的,说明STL各个模块的设计是统一的。


成员函数 replace

string& replace(int pos, int n, const string& str);
//将当前字符串的从pos开始的n个字符,替换为字符串str
string& replace(int pos, int n, const char* s);
//将当前字符串的从pos开始的n个字符,替换为字符串s

代码的使用如下:
string s1;
string s2("Hello World!");

s1.append("Hi");

s1.append("Hi");
s2.replace(0, 5, s1);
cout << s2 << endl;

输出结果:

Hi World!

6.比较

成员函数 compare

  • 字符串比较是按字符的ASCII码进行对比

compare函数依据字典序比较,在当前字符串比给定字符串小时返回-1,在当前字符串比给定字符串大时返回1,相等时返回0。

在C++中,使用string类的compare函数比较两个字符串的大小时,如果短字符串是长字符串的前缀,那么结果是短字符串小于长字符串。

int compare(const string& s) const;
//与字符串s比较
int compare(const char* s) const;
//与C风格的字符数组比较

代码的使用如下:

string s1;
string s2("Hello World!");

//s1的字符串内容为"Hello"
s1.assign(s2, 0, 4);
cout << s1.compare(s2) << endl;

输出结果:

-1

重载比较操作符

bool operator<(const string& str) const;
bool operator<(const char* str) const;
bool operator<=(const string& str) const;
bool operator<=(const char* str) const;
bool operator==(const string& str) const;
bool operator==(const char* str) const;
bool operator>(const string& str) const;
bool operator>(const char* str) const;
bool operator>=(const string& str) const;
bool operator>=(const char* str) const;
bool operator!=(const string& str) const;
bool operator!=(const char* str) const;

7.子串

成员函数 substr

string substr(int pos = 0, int n = npos) const;
//返回由pos开始的n个字符组成的字符串

string::npos的含义是到整个字符串结束


代码的使用如下:

string s5(s2.substr(0, 5));
cout << s5 << endl;

输出结果:

Hello

8.插入

成员函数 insert

string& insert(int pos, const char* s); 
//在pos位置插入C风格字符数组
string& insert(int pos, const string& str);
//在pos位置插入字符串str
string& insert(int pos, int n, char c);
//在pos位置插入n个字符c

9.删除

成员函数 erase

string::npos的含义是删除到整个字符串结束。

string& erase int pos, int n = npos);
//删除从pos位置开始的n个字符

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

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

相关文章

python接口自动化测试 之mock模块基本使用介绍

目录 mock作用 解决依赖问题&#xff0c;达到解耦作用 模拟复杂业务的接口 单元测试 前后端联调 mock类解读 mock实际使用 一个未开发完成的功能如何测试&#xff1f; 一个完成开发的功能如何测试&#xff1f; mock装饰器 mock作用 解决依赖问题&#xff0c;达到解耦…

AutoCAD2021安装教程图解+系统要求

AutoCAD2021具有完善的图形绘制功能&#xff0c;是一款非常实用的CAD图形制作软件&#xff0c;这款软件在业内也拥有极高的知名度&#xff0c;基本上绘图专业相关人员都会使用这款软件&#xff0c;来进行设计绘图。在软件中&#xff0c;为用户打造了超多实用的工具&#xff0c;…

python学习路线图(2023详细版)建议收藏

Python是一种面向对象的程序设计语言&#xff0c;由Python3演变而来&#xff0c;Python的目标是简单、可扩展并且高效。Python可以作为 Web应用程序、桌面应用程序和桌面 Web应用程序开发的理想语言&#xff0c;并且有很多优点它可以使用一些简单的参数和函数、Python支持多种数…

【Linux 网络编程5】网络/数据链路层--IP协议,MAC帧协议和ARP协议

IP协议格式和字段含义4位版本&#xff1a;IPv4或者Ipv6(他们两个不兼容)&#xff1b;4位首部长度&#xff1a;报头首部长度*4&#xff1b;8位服务类型&#xff1a;3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)&#xff1b; 4位 TOS分别表示: 最小延时, 最大…

【SpringCloud】1、服务网关Gateway

这里写目录标题1.网关的介绍2.GateWay2.1 GateWay介绍1.网关的介绍 大家都知道在微服务架构中, 一个系统会被拆分为很多个微服务, 那么作为客户端要如何去调用这么多的微服务呢? 如果没有网关的存在, 我们只能在客户端记录每个微服务的地址, 然后分别去调用 这样的架构, 会…

2023-04-14 使用纯JS实现一个2048小游戏

文章目录一.实现思路1.2048的逻辑2.移动操作的过程中会有三种情况二.代码部分:分为初始化部分和移动部分1.初始化部分1.1.生成第一个方块:1.2.生成第二个方块:2.移动过程部分:三.实现代码1.HTML部分2.CSS部分3.JS部分3.1.game对象的属性3.2.game对象的start方法3.3.game对象的r…

材料科学基础学习指导-吕宇鹏-名词和术语解释-第5章:相图

目录 第一部分 第二部分​​​​​​​ 第三部分 第四部分​ 第一部分 1.1组元&#xff1a;是材料科学中的基本术语。意思是组成合金的独立的、最基本的单元。 1.2相&#xff1a; 指合金中具有同一聚集状态、同一晶体结构和性质并以界面相互隔开的均匀组成部分。​​​​…

【DS】河南省第十三届ICPC大学生程序设计竞赛 J-甜甜圈

明天就要省赛了&#xff0c;感觉已经寄了捏 J-甜甜圈_河南省第十三届ICPC大学生程序设计竞赛&#xff08;重现赛&#xff09; (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 直接模拟复杂度太高&#xff0c;因此考虑用DS优化 我们考虑用树状数组维护 在用线段树和树状…

python 填充Word文档模板 循环填充表格、图片 docxtpl、 jinja2

python 填充Word文档 循环填充表格、图片codeword模板input.txt 内容参考code from docxtpl import DocxTemplate, InlineImage from docx.shared import Inches, Cm, Mm import jinja2word_template tpl.docx out_word_file new_test.docx input_file "input.txt&quo…

【机器学习】决策树(实战)

决策树&#xff08;实战&#xff09; 目录一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、树模型的可视化展示1、通过鸢尾花数据集构建一个决策树模型2、对决策树进行可视化展示的具体步骤3、概率估计三、决策边界展示四、决策树的正则化&a…

【Microsoft Edge】关于 Microsoft Edge 浏览器多版本安装目录结构的测试分析

文章目录1. 问题描述准备工作二、测试2.1. 运行手动保存的安装程序无法安装2.2、依次从低版本到高版本安装2.2.1 运行腾讯电脑管家下载的正式版 112.0.1722.392.2.2 用 MicrosoftEdgeSetup 安装包安装正式版 112.0.1722.482.2.3 用 MicrosoftEdgeSetupBeta 安装包安装 Beta 版 …

别再只会使用简单的ping命令了,Linux中这些高级ping命令可以提高工作效率!

当你需要测试网络连接或者诊断网络问题时&#xff0c;ping命令是一个非常有用的工具。除了基本的用法&#xff0c;ping还有一些高级用法&#xff0c;可以帮助你更好地使用它。 一、基本用法 首先&#xff0c;让我们回顾一下ping的基本用法。ping命令用于测试与另一台计算机的…

C++ 类之间的横向关系(组合、依赖、关联和聚合)

目录 组合&#xff08;复合&#xff09; 定义 举例 依赖 定义 举例 关联 定义 举例 聚合 定义 举例 组合&#xff08;复合&#xff09; 定义 它是一种"is a part of"的关系&#xff0c;部分与整体&#xff0c;包含与被包含。组合是一个类中包含另一个类对…

企业如何高效管理新媒体矩阵账号?提升运营效率,监管内容风险

2023年&#xff0c;面对不确定的市场环境&#xff0c;更要精准把控业务动向&#xff0c;对于在抖音、小红书、视频号、快手等新媒体平台&#xff0c;布局大量账号的企业&#xff0c;实现矩阵账号的统一治理&#xff0c;不仅是应对市场不确定性影响的关键&#xff0c;更为有效降…

NC65合并报表如何取消上报并退回以及注意事项和相关问题总结

NC65合并报表如何取消上报并退回&#xff1f; 在【企业绩效管理】-【合并报表】-【合并】-【合并执行】节点中&#xff0c;点击〖数据中心〗按钮&#xff0c;在弹出的〖合并报表数据中心〗界面中&#xff0c;点击〖报送管理〗-〖合并方案请求退回〗&#xff0c;然后到【合并综…

Qt编写推流综合应用示例-文件推流

一、功能特点 1.1 文件推流 指定网卡和监听端口,接收网络请求推送音视频等各种文件。实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。可指定多种模式,0-直接播放、1-下载播放。实时打印显示各种收发请求和应答数据。每个文件对应MD5加密的唯一标识符…

JavaScript的基础

文章目录一、JavaScript 声明提升二、JavaScript 严格模式(use strict)三、JavaScript 表单四、JavaScript 表单验证五、JavaScript 验证 API总结一、JavaScript 声明提升 JavaScript 中&#xff0c;函数及变量的声明都将被提升到函数的最顶部。 JavaScript 中&#xff0c;变…

ClickHouse之采样查询(SAMPLE)

文章目录SAMPLE概念SAMPLE功能SAMPLE语法sample Ksample Nsample K offset mgroupArraySample语法SAMPLE概念 该 SAMPLE 子句允许近似于 SELECT 查询处理。 启用数据采样时&#xff0c;不会对所有数据执行查询&#xff0c;而只对特定部分数据&#xff08;样本&#xff09;执行…

电脑C盘被格式化 如何快速将被删的数据文件恢复找回?

如今的互联网时代&#xff0c;不管是办公还是休闲&#xff0c;一般都喜欢在电脑上进行操作&#xff0c;尤其是办公&#xff0c;感觉有了电脑能轻松不少&#xff0c;可以将一些工作中的重要数据保存在电脑里面&#xff0c;那么电脑里面的数据真就很安全了吗&#xff1f;这个就让…

Unity ShaderVariant 变体收集方案分析

最近遇到一个问题&#xff0c;在editor中场景渲染正确&#xff0c;打包android之后&#xff0c;渲染异常。 经过排查得出原因&#xff1a;工程把所有shader单独打包Assetbundle&#xff0c;editor打包ab包的时候&#xff0c;未收集到正确的shader变体&#xff0c;未将场景中使…