【C++】STL(二) string容器
一、string基本概念
1、本质
string是C++风格的字符串,而string本质上是一个类
string和char * 区别:
char * 是一个指针
string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。
2、特点
1、string 类内部封装了很多成员方法
(例如:查找find,拷贝copy,删除delete 替换replace,插入insert)
2、string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
3、string构造函数
① string构造函数原型:
string(); // 创建一个空的字符串 例如:string str;
string(const char * s); // 使用字符串s初始化
string(const string & str); // 使用一个string对象初始化另一个string对象
string(int n,char c); //使用n个字符c初始化
② string的多种构造方式没有可比性,灵活使用即可。
例子
#include <iostream>
using namespace std;
#include<string> //string的构造函数/*
构造函数原型:string(); //创建一个空的字符串 例如: string str;string(const char* s); //使用字符串s初始化string(const string& str); //使用一个string对象初始化另一个string对象string(int n, char c); //使用n个字符c初始化
*/void stringtest01()
{string s1; //默认构造 就是空字符串const char *str = "lalalala";string s2(str); //使用字符串 s 初始化string s3(s2);string s4(5, 'a');cout << "s2 = " << s2 << endl;cout << "s3 = " << s3 << endl;cout << "s4 = " << s4 << endl;
}int main()
{stringtest01();system("pause");return 0;
}

2.3 string赋值操作
① 给string字符串进行赋值。
② 赋值的函数原型:
赋值的函数原型:string& operator=(const char* s); //char*类型字符串 赋值给当前的字符串string& operator=(const string &s); //把字符串s赋给当前的字符串string& operator=(char c); //字符赋值给当前的字符串string& assign(const char *s); //把字符串s赋给当前的字符串string& assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串string& assign(const string &s); //把字符串s赋给当前字符串string& assign(int n, char c); //用n个字符c赋给当前字符串
③ string的赋值方式很多,operator=这种方式是比较常用的。
例子
void stringtest02()
{string s1 = "cgslbdfapofclaujbrank!";cout << "s1 = " << s1 << endl;string s2;s2 = s1; //把字符串s赋给当前的字符串cout << "s2 = " << s2 << endl;string s3;s3 = 'a'; //字符赋值给当前的字符串cout << "s3 = " << s3 << endl;string s4;s4.assign("vvvvvvvv");cout << "s4 = " << s4 << endl;string s5;s5.assign("abcdefghijklmn", 5);cout << "s5 = " << s5 << endl;string s6;s6.assign(s5);cout << "s6 = " << s6 << endl;string s7;s7.assign(9, 'a');cout << "s7 = " << s7 << endl;
}
int main()
{stringtest02();system("pause");return 0;
}

2.4 string字符串拼接— 实现在字符串末尾拼接字符串
① 实现在字符串末尾拼接字符串。
② 函数原型:
字符串拼接函数原型:string& operator+=(const char* str); //重载+=操作符string& operator+=(const char c); //重载+=操作符string& operator+=(const string& str); //重载+=操作符string& append(const char *s); //把字符串s连接到当前字符串结尾string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾string& append(const string &s); //同operator+=(const string& str)string& append(const string &s, int pos, int n); //字符串s中从pos开始的n个字符连接到字符串结尾
例子
void stringtest03()
{string s1 = "I";s1 += "abcd";cout << "s1 = " << s1 << endl;s1 += ':';cout << "s1 = " << s1 << endl;string s2 = "LKMN";s1 += s2;cout << "s1 = " << s1 << endl;s1.append("qwer");cout << "s1 = " << s1 << endl;s1.append("ty:uiop", 3);cout << "s1 = " << s1 << endl;s1.append(s2);cout << "s1 = " << s1 << endl;s1.append(s2, 1, 3);// 从下标1位置开始 ,截取3个字符,拼接到字符串末尾cout << "s1 = " << s1 << endl;
}
int main()
{stringtest03();system("pause");return 0;
}

2.5 string字符串查找和替换
① 查找:查找指定字符串是否存在。
② 替换:在指定的位置替换字符串。
③ 函数原型:
函数原型:int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置int find(const char c, int pos = 0) const; //查找字符c第一次出现位置int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串strstring& replace(int pos, int n,const char* s); //替换从pos开始的n个字符为字符串s
④ find查找是从左往右,rfind从右往左。
⑤ find找到字符串后返回查找的第一个字符位置,找不到返回-1。
⑥ replace在替换时,要知道从哪个位置起,多少个字符,替换成什么样的字符串。
例子
void stringtest04()
{string s1 = "abcdefabcimnlkabcmnrsabcqrst";int pos = (int)s1.find("bc");cout << "找到字符串,位置POS : " << pos << endl;pos = (int)s1.rfind("bc");cout << "找到字符串,位置POS : " << pos << endl;s1.replace(1, 3, "1111"); //从1号位置起后面4个字符替换为 1111 cout << "S1 = " << s1 << endl;
}
int main()
{stringtest04();system("pause");return 0;
}

2.6 string字符串比较
① 功能描述:字符串之间比较。
② 比较方式:字符串比较是按字符的ASCII码进行对比。
比较方式:字符串比较是按字符的ASCII码进行对比= 返回 0> 返回 1< 返回 -1
③ 函数原型:
函数原型:int compare(const string &s) const; //与字符串s比较int compare(const char *s) const; //与字符串s比较
例子
void stringtest05()
{string s1 = "abcdefg";string s2;s2.assign(s1);string s3 = "sddfghh";cout << "s1 : " << s1 << endl;cout << "s2 : " << s2 << endl;cout << "s3 : " << s3 << endl;int ret = s1.compare(s2);cout << "S1 & S2 比较结果 : " << ret << endl;ret = s1.compare(s3);cout << "S1 & S3 比较结果 : " << ret << endl;
}

2.7 string字符串存取
① string中单个字符存取方式有两种:
string中单个字符存取方式有两种char& operator[](int n); //通过[]方式取字符char& at(int n); //通过at方法获取字符
例子
void stringtest06()
{string s1 = "abcdefg";cout << "s1 = " << s1 << endl;for (int i = 0; i < s1.size(); i++){cout << s1[i] << " " << endl;}char c = s1.at(3);//通过at方法获取字符cout << "第3个字符为: " <<c << endl;//通过上述两种方式修改字符串值s1[0] = 'x';cout << "s1 = " << s1 << endl;s1.at(3) = 'x';cout << "s1 = " << s1 << endl;
}

2.8 string字符串插入和删除
① 功能描述:对string字符串进行插入和删除字符操作。
② 函数原型:
函数原型:string& insert(int pos, const char* s); //插入字符串string& insert(int pos, const string& str); //插入字符串string& insert(int pos, int n, char c); //在指定位置插入n个字符cstring& erase(int pos, int n = npos); //删除从Pos开始的n个字符
*/
③ 插入和删除的起始下标都是从0开始。
例子
void stringtest07()
{string s1 = "abcdefg";cout << "s1 = " << s1 << endl;s1.insert(2, "WWW");cout << "s1 = " << s1 << endl;s1.erase(2, 3);cout << "s1 = " << s1 << endl;
}

2.9 string子串获取
① 功能描述:从字符串中获取想要的子串。
② 函数原型:
函数原型:string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串
*/
③ 灵活的运用求子串功能,可以在实际开发中获取有效的信息。
例子
void stringtest08()
{string s1 = "abcdefg";cout << "s1 = " << s1 << endl;string s2 = s1.substr(2, 3);cout << "s2 = " << s2 << endl;//截取邮箱名字string email = "dzl_emails@163.com";int pos = (int)email.find('@'); //找到 @ 符号位置string UserName = email.substr(0, pos); //从位置0到pos位置间,就是邮箱名字,可以使用子串返回cout << "UserName : " << UserName << endl;
}

相关文章:
【C++】STL(二) string容器
一、string基本概念 1、本质 string是C风格的字符串,而string本质上是一个类 string和char * 区别: char * 是一个指针 string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。 2、特点 1、stri…...
PyCM:Python中的混淆矩阵库
PyCM:Python中的混淆矩阵库 在机器学习和数据科学领域,评估模型的性能是至关重要的。混淆矩阵是一种常用的评估工具,用于可视化和量化分类模型的预测结果。PyCM是一个开源的Python库,提供了丰富的功能来计算和分析混淆矩阵。本文将…...
Day22:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用
目录 开发环境 数据导入-mysql架构&库表列 数据库操作-mysqli函数&增删改查 数据接收输出-html混编&超全局变量 第三方插件引用-js传参&函数对象调用 完整源码 思维导图 PHP知识点: 功能:新闻列表,会员中心࿰…...
IOS面试题object-c 61-70
61. 阐述isKindOfClass、isMemberOfClass、selector作用分别是什么?isKindOfClass:作用是某个对象属于某个类型或者继承自某类型。 isMemberOfClass:某个对象确切属于某个类型。 selector:通过方法名,获取在内存中的函…...
Git指令reset的参数soft、mixed与hard三者之间的区别
主要内容 reset默认不写参数,与使用mixed参数含义一样 为了描述简洁,使用下图说明: #mermaid-svg-LtChquRXlEV1j6og {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LtChquRXlEV1j…...
RGMII 接口调试
目录 硬件检查 软件检查 调试步骤 硬件检查 硬件工程师检查原理图和PCB,核查RGMII线路连接是否正确,PHY的 TX连接对端 RX,PHY的RX连接对端TX,原理图上以引脚序号引脚名 引脚类型(输入还是输出)逐一核查RGMII接口各个网络&#…...
Ubuntu 24.04 抢先体验换国内源 清华源 阿里源 中科大源 163源
Update 240307:Ubuntu 24.04 LTS 进入功能冻结期 预计4月25日正式发布。 Ubuntu22.04换源 Ubuntu 24.04重要升级daily版本下载换源步骤 (阿里源)清华源中科大源网易163源 Ubuntu 24.04 LTS,代号 「Noble Numbat」,即将与我们见面! Canonica…...
软件设计模式:模板方法模式
1. 简介 模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 2. 使用条件 模板方法模式适用于以下情况: 算法…...
【算法】Hash存储——开放寻址法
模拟散列表 维护一个集合,支持如下几种操作: I x,插入一个整数 x; Q x,询问整数 x是否在集合中出现过; 现在要进行 N次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&am…...
STM32CubeIDE基础学习-STM32CubeIDE软件程序下载方法
STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法前言第1章 代码下载第2章 下载器固件更新总结 前言 编写完代码,一般都会选择在线下载程序的方式进行验证该程序是否正确,如果发现结果和…...
LeetCode 174.地下城游戏 Python题解
地下城游戏 # 地下城游戏 """ 恶魔们抓住了公主并将她关在了地下城dungeon的右下角。地下城是由mxn个房间组成的二维网格。我们英勇的骑士最初被安置在左上角的房间里, 他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数…...
指令调用模板
也就是这边指令通过id和map会定位到一个结构体,然后这个结构再赋值两个成员,一个是函数一个是指令类型,然后这个函数是模板的实例化 使用的时候就传进去,这只是参数,最开始初始化的时候模板就已经实例化了。然后关于模…...
(五)关系数据库标准语言SQL
注:课堂讲义使用的数据库 5.1利用SQL语言建立数据库 5.1.1 create Database 5.1.2 create schema...authorization... 创建数据库和创建模式的区别: 数据库是架构的集合,架构是表的集合。但在MySQL中,他们使用的方式是相同的。 …...
第二十天-数据分析
1.介绍 1.什么是数据分析 1.以下4个纬度结合起来的数据科学 2.数据分析的特殊性...
鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:外描边设置)
设置组件外描边样式。 说明: 从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 outline outline(value: OutlineOptions) 统一外描边样式设置接口。 卡片能力: 从API version 11开始,该…...
鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:CalendarPicker)
日历选择器组件,提供下拉日历弹窗,可以让用户选择日期。 说明: 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 CalendarPicker(options?: CalendarOptions) …...
wordpress免费主题下载
免费wordpress模板下载 简洁大气的文化艺术类wordpress模板,可以免费下载,实用易上手,新手也适合。 https://www.wpniu.com/themes/304.html 免费wordpress主题下载 高端大气上档次的wordpress主题,也可以是免费的,…...
【字典合集】SecLists-更全面的渗透测试字典 v2024.1
下路路径 SecLists-更全面的渗透测试字典 v2024.1 简介 SecLists 是一个致力于收集各种安全字典的开源项目。这些字典包括但不限于:密码字典、用户名字典、网络扫描结果、漏洞利用载荷、web shells、可用于渗透测试的Payloads、以及其他各种安全相关的字典。 这…...
PID控制器组(完整SCL代码)
PID控制器组不是什么新概念,是在PID控制器的基础上,利用面向对象的思想对对象进行封装 批量实例化。 1、增量式PID https://rxxw-control.blog.csdn.net/article/details/124363197https://rxxw-control.blog.csdn.net/article/details/1243631972、完全增量式PID https:/…...
五、OpenAI实战之Assistants API
在8线小城的革委会办公室里,黑8和革委会主任的对话再次展开。 黑8:主任,您知道吗?除了OpenAI API,现在还有一项新的技术叫做Assistants API,它可以帮助我们更好地进行对话和沟通。 主任:Assis…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
