【C++第三阶段】string容器

以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • string容器
    • 基本概念
    • 构造函数
    • 赋值操作
    • 拼接操作
    • 字符串查找和替换
    • 字符串比较
    • 字符串存取
    • 字符串插入和删除
    • 字符串子串


string容器

基本概念

本质👉string是C++风格的字符串,string本质上是一个类。

string VS char *

char *是一个指针。

string是类,里面封装char* , 类管理该字符串,是一个char*型的容器。

特点:

string类内部封装很多成员方法,例如查找find , 拷贝copy , 删除delete , 替换replace ,插入insert。

string管理char*分配内存,不用担心复制越界和取值越界等,由类内部负责。

构造函数

无参构造,字符串初始化,拷贝构造函数,以及n字符c初始化。

n字符c必须要是单引号。

以下是代码示例。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;void test0403() {//先定义一个常量字符串const char* str = "hello world";//无参构造函数string no_param_str;//有参构造函数string param_str(str);//拷贝构造函数string copy_str(param_str);//n字符c构造函数string nc_str( 10,'?');cout << "无参构造:" << no_param_str << endl;cout << "有参构造:" << param_str << endl;cout << "拷贝构造:" << copy_str << endl;cout << "n字符c构造:" << nc_str << endl;}int main() {test0403();system("pause");return 0;
}

运行截图:

image-20240403164039020

赋值操作

提供7种赋值操作。方法为自己写的myAssign

const char *s 是双引号的字符出串,const string &s是单独的字符串变量名字。

  • char * 类型字符串,赋值给当前的字符串
  • string & operator =(const char *s);
  • 把字符串s赋值给当前的字符串
  • string & operator=(const string &s);
  • 字符赋值给当前的字符串
  • string & operator=(char c);
  • 把字符串赋给当前的字符串
  • string & assign(const char *s);
  • 把字符串s的前n个字符赋值给当前的字符串
  • string & assign(const char *s,int n );
  • 把字符串赋值给当前字符串
  • string & assign(const string &s);
  • 用n个字符c赋值给当前字符串
  • string & assign(int n , char c);
void myAssign() {string str_a = "hello"; //1.string str_b = str_a;  //2.//string& operator = (const string & str);string str_c;str_c = 'a';string str_d;str_d.assign(str_c);//char *b = 'abcdefg';string str_e;str_e.assign("hello,world", 11);string str_f;str_f.assign(str_e);string str_g;str_g.assign(str_e,0 ,5); //从0到4,5个字符string str_h;str_h.assign(5, 'w');cout << "str a = " << str_a <<" . " <<endl;cout << "str b = " << str_b <<" . " <<endl;cout << "str c = " << str_c <<" . " <<endl;cout << "str d = " << str_d <<" . " <<endl;cout << "str e = " << str_e <<" . " <<endl;cout << "str f = " << str_f <<" . " <<endl;cout << "str g = " << str_g <<" . " <<endl;cout << "str h = " << str_h << " . " << endl;}

image-20240407203653931

拼接操作

提供7种拼接操作。

  • 直接拼接字符数组

  • string & operator+=(const char * str);

  • 拼接单个字符

  • string & operator+=(const char c);

  • 拼接字符串

  • string & operator +=(const string & str);

  • 追加至末尾单个字符

  • string & append(const char *s);

  • 追加字符串的前n个字符至当前字符末尾

  • string & append(const char *s , int n);

  • 追加字符串

  • string & append(const string &s);

  • 从pos位置开始,追加n个字符到当前字符串末尾

  • string & append(const string &s , int pos , int n);

void myAppend() {string str = "aaa";cout << "str = " << str << endl;str += 'b';cout << "str = " << str << endl;str += "c";cout << "str = " << str << endl;str.append("e"); //当我输入'e'时,说没有这个重载。cout << "str = " << str << endl;str.append("world,hello", 5);cout << "str = " << str << endl;str.append("hello");cout << "str = " << str << endl;str.append("microsoft visual", 0, 9);cout << "str = " << str << endl;
}

image-20240407203124496

字符串查找和替换

查找:查找指定字符串是否存在

  • 查找字符str第一次出现的位置,从pos的位置开始查找。
  • int find(const string & str , int pos = 0) const;
  • 查找字符串s第一次出现的位置,从pos位置开始找。
  • int find(const char* s ,int pos = 0) const;
  • 查找字符串s前n个字符中,从pos位置开始找。
  • int find(const char* s , int pos , int n) const;
  • 找字符c出现的位置,从pos位置开始找
  • int find(const char c ,int pos = 0) const;

rfind的索引仍然是从左往右来看的,但是查找时是从右往左。

  • 倒着查找,找字符串第一次出现的位置
  • int rfind(const string & str , int pos = npos) const;
  • 倒着查找,找字符串中
  • int rfind(const char*s , int pos ,int n) const;
  • 倒着查找,从pos查找s的前n个字符最后一次出现位置
  • int rfind(const char c , int pos ,int n) const;
  • 查找字符c最后一次出现位置。
  • int rfind(const char c , int pos = 0) const;

代码示例

void myFind() {string str = "hello,world,olleh,dlrow";string test = "le";int a, b, c, d, e, f, g, h;a = str.find(test, 0);cout << a << endl;b = str.find("el", 0);cout << b << endl;c = str.find("e", 0,10);cout << c << endl;d = str.find('e', 0);cout << d << endl;e = str.rfind(test, -1);//从row那里开始从右往左找,应该是14,cout << e << endl;f = str.rfind("l", -1);//从row那里开始从右往左找,应该是19cout << f << endl;g = str.rfind("le", -1,2);//从row开始从右往左找,从右往左第3个位置开始找,应该是14cout << g << endl;h = str.rfind('l', -1);//从row那里开始从右往左找,应该是19cout << h << endl;}

image-20240407212149095

替换:在指定位置替换字符串

  • pos位置起始的n个字符替换成str
  • string & replace (int pos , int n , const string& str);
  • pos位置起始的n个字符替换成s
  • string & replace(int pos , int n , const char* s);
void myReplace() {string str = "hello,world;";string test = "?????";str.replace(0, 3, test);cout << str << endl;str.replace(0, 5, "a");cout << str << endl;}

image-20240407212528184

字符串比较

比较按照字符串的ASCII码比较

  • 与字符串s比较

  • int compare(const string &s) const;

  • int compare (const char *s) const;

void myCompare() {string str = "hello";string rts = "hello";int result = str.compare(rts);if (result==0) {cout << "两者一样" << endl;}else {cout << "两者不一样" << endl;}
}

image-20240407214801444

字符串存取

两种方式

char& operator[] (int n );

char& at(int n);

void myInOut() {string str = "hello?world";cout << str[1] << endl;cout << str.at(2) << endl;
}

image-20240407214948544

字符串插入和删除

四种方式

string& insert(int pos , const char* s);插入字符串

string& insert(int pos , const string& str);插入字符串

string& insert(int pos , int n , char c);在指定位置插入n个字符c

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

void myInsertDelete() {string str = "空空如也";str.insert(0, "?");cout << "str = " << str << endl;str.insert(3, "!!!") ;cout << "str = " << str << endl;str.insert(5, 5, '.');cout << "str = " <<str<< endl;str.erase(5, 2);cout << "str = " << str << endl;
}

这个位置说的是字符的具体位置,不是索引。

image-20240407215620139

字符串子串

从字符串中获取想要的子串。

string substr(int pos = 0 , int n = npos) const;

void mySubString() {string str = "hello";string sub = str.substr(0, 4);cout << "sub = " << sub << endl;
}

image-20240407220057016


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

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

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

相关文章

快速获取文件夹及其子文件夹下的所有文件名

1、在文件夹中新建文本文档&#xff0c;命名为“命令.txt” 2、输入以下内容 tree /F > 文件名.txt dir *.* /B > 文件名.txt 其中文件名和文件格式可以是任意的&#xff0c;tree命令可生成文件及其子文件夹下所有文件的名称&#xff0c;dir命令只生成当前目…

网络基础三——初识IP协议

网络基础三 ​ 数据通过应用层、传输层将数据传输到了网络层&#xff1b; ​ 传输层协议&#xff0c;如&#xff1a;TCP协议提供可靠性策略或者高效性策略&#xff0c;UDP提供实时性策略&#xff0c;保证向下层交付的数据是符合要求的的&#xff1b;而网络层&#xff0c;如&a…

LeetCode 40. 组合总和 II

解题思路 cand[]{1,2,3,4} target4; 相关代码 class Solution {List<List<Integer>> res;List<Integer> path;boolean st[];public List<List<Integer>> combinationSum2(int[] candidates, int target) {path new ArrayList<>();res …

c++前言

目录 1. 什么是 C 2. C 发展史 3. C 的重要性 4. 如何学习 C 5. 关于本门课程 1. 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c; C 语言则不合适…

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…

备战蓝桥杯---线段树应用2

来几个不那么模板的题&#xff1a; 对于删除&#xff0c;我们只要给那个元素附上不可能的值即可&#xff0c;关键问题是怎么处理序号变化的问题。 事实上&#xff0c;当我们知道每一个区间有几个元素&#xff0c;我们就可以确定出它的位置&#xff0c;因此我们可以再维护一下前…

优秀企业都在用的企微知识库,再不搭建就晚了!

每个团队都在寻找让工作效率提升的方法。如果你想知道哪些团队能够高效地完成任务&#xff0c;而另一些却步履维艰&#xff0c;那么答案可能就是“企业微信知识库”。见过很多团队都在使用它&#xff0c;而且效果非常显著。如果你还没有搭建属于自己的企微知识库&#xff0c;可…

C++ 【原型模式】

简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象&#xff0c;客户端不需要知道要复制的对象是哪个类的实例&#xff0c;只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类&#xff0c;客户端代码无需改变&#xff0c;只需修改原型工…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰&#xff0c;主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统&#xff0c;商城系统&#xff0c;支付系统&#xff0c;供应链系统&#xff0c;人力资源管理系统&#xff0c;ERP系统等等。这些系统不管大公司还是小公司往往都需…

简约轻量-失信录系统源码

失信录系统-最新骗子收录查询系统源码 首页查询&#xff1a; 举报收录页&#xff1a; 后台管理页&#xff1a; 失信录系统 V1.0.0 更新内容&#xff1a; 1.用户查询,举报功能 2.界面独立开发 3.拥有后台管理功能 4.xss,sql安全过滤 5.平台用户查询 6.用户中心&#xff08;待完…

揭开“栈和队列”的神秘面纱

前言 在线性表中不止有顺序表和链表&#xff0c;今天的主角就如标题所说--->认识栈和队列。把他们俩放一起总结是有原因的&#xff0c;还请看官听我娓娓道来~ 什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 咱可以把栈理…

【活动创作】未来AI技术方面会有哪些创业机会

放假期间突然看到这个活动创作&#xff0c;觉得很有意思&#xff0c;既然如此&#xff0c;我就先让AI来回答一下吧&#xff0c;哈哈 1、文心一言 首先来看看文心一言的回答&#xff1a; 2、讯飞星火 然后来看看讯飞星火的回答&#xff1a; 3、个人感受 最后来说说给人感受吧&am…

深入剖析主机安全中的零信任机制及其实施原理

引言 在数字化转型加速与云端服务普及的大背景下&#xff0c;传统依赖边界的网络安全模式逐渐显露出其局限性。面对愈发复杂多变的威胁环境&#xff0c;零信任安全架构作为新一代的安全范式应运而生&#xff0c;尤其是在主机层面的安全实践中&#xff0c;零信任机制正扮演着至…

【QT+QGIS跨平台编译】056:【pdal_arbiter+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_arbiter介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_arbiter介绍 pdal_arbiter是 PDAL 项目的一个库,用于帮助管理应用程序运行在 EC2 实例上的 AWS 凭证。 当应用程序需要调用 AWS API 时,它们必须使用 AWS 凭据对 AP…

达梦DMHS-Manager工具日常操作

目录 1、前言 2、同步服务管理 2.1、DMHS Agent节点管理 2.2、DMHS实例节点管理 2.3、DMHS模块节点管理 3、监控及告警 3.1、主机资源监控 3.2、同步链路监控 3.3、告警配置 4、系统管理 4.1、用户管理 4.2、角色管理 4.3、系统配置 4.4、审计信息 5、联机帮助 …

2024软件测试全套教程,软件测试自学线路图

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

4.7Qt

自由发挥应用场景实现一个登录窗口界面。 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("原神启动");this->setWindowIcon(QIcon("C:\\Users\\17212\\Pict…

工具推荐-针对Nacos利器-NacosExploitGUI_v4.0

Nacos是由阿里所开发的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 工具简介 集成Nacos的各种poc Nacos控制台默认口令漏洞(nacos,nacos)Nacostoken.secret.key默认配置(QVD-2023-6271)Nacos-clientYaml反序列化漏洞Nacos Jraft Hessian反序列化漏洞…

Redis中的Sentinel(六)

Sentinel 选举领头Sentinel. 当一个主服务器被判断为客观下线时&#xff0c;监视这个下线主服务器的各个Sentinel会进行协商&#xff0c;选举出一个领头Sentinel,并由领头 Sentinel对下线主服务器执行故障转移操作。以下是Redis选举领头Sentinel的规则和方法: 1.所有在线的S…

AcWing---转圈游戏---快速幂

太久没写快速幂了... 这是一道数学题orz&#xff0c;能看出来的话答案就是 &#xff0c;但是很大&#xff0c;同时还要mod n&#xff0c;直接用快速幂即可。 快速幂模版&#xff1a; long long int power(long long int a,long long int b,long long int mod){long long int r…