当前位置: 首页 > news >正文

C++回顾(十九)—— 容器string

19.1 string概述

  • 1、string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是 用char * 表示的。string 与char * 都可以用来表示字符串,那么二者有什么区别呢。

  • 2、string和 char * 的比较
    (1)string是一个类, char*是一个指向字符的指针。
    (2)string封装了char * ,管理这个字符串,是一个char * 型的容器。
    (3)string不用考虑内存释放和越界。
    (4)string管理char * 所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

  • 3、string提供了一系列的字符串操作函数(这个等下会详讲)
    查找find,拷贝copy,删除erase,替换replace,插入insert

19.2 string构造

(1)默认构造函数:

string();    //构造一个空的字符串string s1。

(2)拷贝构造函数:

string(const string &str);  //构造一个与str一样的string。如string s1(s2)。

(3)带参数的构造函数

string(const char *s);    //  用字符串s初始化
string(int n,char c);    //  用n个字符c初始化

例子:
在这里插入图片描述
完整示例代码:

#include <iostream>
#include <string>using namespace std;int main()
{string s1;                 //无参构造函数string s2("helloworld");   //有参构造函数string s3(10, 'a');   string s4(s2);            //拷贝构造函数cout << s1 << endl;   //重载了输出运算符 << cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;cin >> s1;   //重载了输入运算符 >> cout << s1 << endl;s1 += "helloworld";  // 重载了 += 运算符if (s1 == s2)	// 重载了 == 运算符{}s1 = s1 + s2;   // 重载了 = 运算符return 0;
}

运行结果:
在这里插入图片描述

19.3 string使用

(1)string的存取字符操作:[ ] 或者 s.at( )

  • string类的字符操作:
const char &operator[] (int n) const; // 常函数(不改变成员变量)
const char &at(int n) const;  // 常函数(不改变成员变量)
char &operator[] (int n);
char &at(int n);
  • operator[]和at()均返回当前字符串中第n个字符,但二者是有区别的。
    主要区别在于at()在越界时会抛出异常,[ ]在刚好越界时会返回(char)0,再继续越界时,编译器直接出错。如果你的程序希望可以通过try,catch捕获异常,建议采用at()。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    完整示例代码:
#include <iostream>
#include <exception>using namespace std;int main()
{string s("helloworld");cout << s[1] << endl;        //重载了下标运算符s[1] = 'x';cout << s << endl;cout << s.at(1) << endl;     //通过成员函数来访问下标为 1 的元素//cout << s[20000] << endl;    //越界访问程序异常结束try{cout << s.at(10) << endl;      //使用成员函数at(),越界访问会抛出异常}catch (exception &e){cout << e.what() << endl;}return 0;
}

运行结果:
在这里插入图片描述

(2)从string取得字符串首地址的操作:s.c_str( )

  • const char *c_str() const; //返回一个以’\0’结尾的字符串的首地址
    在这里插入图片描述
    完整示例代码:
#include <iostream>
#include <string.h>
#include <string>using namespace std;int main()
{char buf[32] = {0};string s("helloworld");strcpy(buf, s.c_str());     //c_str()返回字符串的首地址cout << buf << endl;return 0;
}

运行结果:
在这里插入图片描述

(3)把string拷贝的操作:s.copy( )

把字符串s从第0给下标开始,拷贝5个字符到buf中去。
在这里插入图片描述在这里插入图片描述
完整示例代码:

#include <iostream>
#include <string.h>using namespace std;int main()
{char buf[32] = {0};string s("helloworld");s.copy(buf, 5);               //第二个参数表示拷贝5个字节,第三个参数是默认参数,拷贝的位置,默认是0cout << buf << endl;memset(buf, 0, sizeof(buf));s.copy(buf, 4, 5); // 拷贝四个字节,从下标为5的字符开始拷贝cout << buf << endl;return 0;
}

运行结果:
在这里插入图片描述

(4)string的长度:s.length() 与 s.empty()

完整示例代码:

#include <iostream>using namespace std;int main()
{string s("helloworld");cout << s.length() << endl;if (s.empty()){cout << "长度为空" << endl;}else{cout << "长度不为空" << endl;}return 0;
}

运行结果:
在这里插入图片描述

(5)string的赋值:重载的 = 运算符 与 s.assign()

示例代码:

#include <iostream>using namespace std;int main()
{string s1("helloworld");s1 = "hello";        //重载了=运算符cout << s1 << endl;const char *s = "this is test";s1.assign(s);  // 把s这个字符串赋值给s1cout << s1 << endl;s1.assign(s, 7); //  把s这个字符串的前7个字符赋值给s1cout << s1 << endl;s1.assign(5, 'a');     //把5个a赋值给s1cout << s1 << endl;string s2("hey boy");s1.assign(s2);         //把对象s2赋值给s1cout << s1 << endl;s1.assign(s2, 4, 3); // 把s2从第四个字符开始往后3个字符,赋值给字符串s1cout << s1 << endl;return 0;
}

运行结果:

在这里插入图片描述

(6)string字符串连接:重载 += 运算符 与 s.append()

示例代码:

#include <iostream>using namespace std;int main()
{string s1("helloworld");s1 += "1234";    //重载了 += 运算符cout << s1 << endl;string s2("abcdefg");s1 += s2;cout << s1 << endl;const char *s = "haha";s1.append(s);cout << s1 << endl;s1.append(s, 2); // 把 s 前两个字符加在s1后面cout << s1 << endl;s1.append(s2);cout << s1 << endl;s1.append(s2, 4, 2);  // 把 s 第四个字符开始往后两个字符加在s1后面cout << s1 << endl;s1.append(10, 'x'); // 把10个x字符追加在字符串cout << s1 << endl;return 0;
}

运行结果:
在这里插入图片描述

(7)string的比较:s.compare()

示例代码:

#include <iostream>using namespace std;int main()
{string s1("helloworld");string s2("helloboy");const char *s = "hellogirl";if (s1.compare(s2) > 0){cout << s1 << " > " << s2 << endl;}if (s1.compare(s) > 0){cout << s1 << " > " << s << endl;}return 0;
}

运行结果:
在这里插入图片描述

(8)string的子串:s.substr()

示例代码:

#include <iostream>using namespace std;int main()
{string s("helloworld");cout << s.substr() << endl; // 返回完整的字符串scout << s.substr(5, 5) << endl; // 从下标五开始,往后五个字符return 0;
}

运行结果:

在这里插入图片描述

(9)string的查找和替换:s.find() 与 s.replace()

  1. 查找
    int find(char c,int pos=0) const; //从pos开始查找字符c在当前字符串的位置

    int find(const char *s, int pos=0) const; //从pos开始查找字符串s在当前字符串的位置

    int find(const string &s, int pos=0) const; //从pos开始查找字符串s在当前字符串中的位置

    注意:find函数如果查找不到,就返回-1

    int rfind(char c, int pos=npos) const; //从pos开始从后向前查找字符c在当前字符串中的位置
    int rfind(const char *s, int pos=npos) const; int rfind(const string &s, int pos=npos) const;
    //rfind是反向查找的意思,如果查找不到, 返回-1

  2. 替换
    string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入串s
    string &replace(int pos, int n, const string &s); //删除从pos开始的n个字符,然后在pos处插入串s
    void swap(string &s2); //交换当前字符串与s2的值

完整示例代码:

#include <iostream>
#include <string.h>using namespace std;int main()
{int p;string s1("helloworld");string s2("world");p = s1.find('o');cout << p << endl; // 4p = s1.find('x');    //不存在返回-1cout << p << endl; // -1p = s1.find('o', 5);cout << p << endl; // 6p = s1.find("ll");cout << p << endl; // 2p = s1.find(s2);cout << p << endl; // 5p = s1.rfind('o');    //反向查找(但是返回的位置还行从左边0开始)cout << p << endl; // 6s1.replace(5, 5, "xxx");cout << s1 << endl; // helloxxxxxs1.replace(5, 3, s2);cout << s1 << endl; // helloworldstring s3("helloworldhelloworldhelloworldhelloworld");p = s3.find("world");while (p != -1){s3.replace(p, strlen("world"), "x");p = s3.find("world", p + strlen("x"));}cout << s3 << endl;return 0;
}

运行结果:
在这里插入图片描述

(10)String的区间删除和插入:s.insert() 与 s.erase()

完整示例代码:

#include <iostream>using namespace std;int main()
{string s1("helloworld");string s2("12345");s1.insert(0, "this is ");// 从下标为0处,插入this iscout << s1 << endl; s1.insert(10, s2); // 从下标为10处,插入s2cout << s1 << endl; s1.insert(0, 5, 'x'); // 从下标为0处,插入5个xcout << s1 << endl;s1.erase(0, 20);cout << s1 << endl; // 删除下标0到20return 0;
}

运行结果:
在这里插入图片描述

相关文章:

C++回顾(十九)—— 容器string

19.1 string概述 1、string是STL的字符串类型&#xff0c;通常用来表示字符串。而在使用string之前&#xff0c;字符串通常是 用char * 表示的。string 与char * 都可以用来表示字符串&#xff0c;那么二者有什么区别呢。 2、string和 char * 的比较 &#xff08;1&#xff09…...

Hadoop入门

数据分析与企业数据分析方向 数据是什么 数据是指对可观事件进行记录并可以鉴别的符号&#xff0c;是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合&#xff0c;它是可以识别的、抽象的符号。 他不仅指狭义上的数字&#xff0c;还可以是具有一…...

高校如何通过校企合作/实验室建设来提高大数据人工智能学生就业质量

高校人才培养应该如何结合市场需求进行相关专业设置和就业引导&#xff0c;一直是高校就业工作的讨论热点。亘古不变的原则是&#xff0c;高校设置不能脱离市场需求太远&#xff0c;最佳的结合方式是&#xff0c;高校具有前瞻性&#xff0c;能领先市场一步&#xff0c;培养未来…...

提升学习 Prompt 总结

NLP现有的四个阶段&#xff1a; 完全有监督机器学习完全有监督深度学习预训练&#xff1a;预训练 -> 微调 -> 预测提示学习&#xff1a;预训练 -> 提示 -> 预测 阶段1&#xff0c;word的本质是特征&#xff0c;即特征的选取、衍生、侧重上的针对性工程。 阶段2&…...

JavaScript学习笔记(2.0)

BOM--&#xff08;browser object model&#xff09; 获取浏览器窗口尺寸 获取可视窗口高度&#xff1a;window.innerWidth 获取可视窗口高度:window.innerHeight 浏览器弹出层 提示框&#xff1a;window.alert(提示信息) 询问框&#xff1a;window.confirm(提示信息) 输…...

直击2023云南移动生态合作伙伴大会,聚焦云南移动的“价值裂变”

作者 | 曾响铃 文 | 响铃说 2023年3月2日下午&#xff0c;云南移动生态合作伙伴大会在昆明召开。云南移动党委书记&#xff0c;总经理葛松海在大会上提到“2023年&#xff0c;云南移动将重点在‘做大平台及生态级新产品&#xff0c;做优渠道转型新动能&#xff0c;做强合作新…...

STM32F1开发实例-振动传感器(机械)

振动(敲击)传感器 振动无处不在&#xff0c;有声音就有振动&#xff0c;哒哒的脚步是匆匆的过客&#xff0c;沙沙的夜雨是暗夜的忧伤。那你知道理科工程男是如何理解振动的吗&#xff1f;今天我们就来讲一讲本节的主角&#xff1a;最简单的机械式振动传感器。 下图即为振动传…...

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

去年公司由于不断发展&#xff0c;内部自研系统越来越多&#xff0c;所以后来搭建了一个日志收集平台&#xff0c;并将日志收集功能以二方包形式引入自研系统&#xff0c;避免每个自研系统都要建立一套自己的日志模块&#xff0c;节约了开发时间&#xff0c;管理起来也更加容易…...

2023-3-10 刷题情况

打家劫舍 IV 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统&#xff0c;所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大…...

如何建立一个成功的MES?

制造执行系统&#xff08;MES&#xff09;是一种为制造业企业提供实时生产过程控制、管理和监视的信息系统。一个成功的MES系统可以帮助企业提高生产效率&#xff0c;降低成本&#xff0c;提高产品质量&#xff0c;提高客户满意度等。下面是一些关键步骤来建立一个成功的MES系统…...

Kafka生产者幂等性/事务

Kafka生产者幂等性/事务幂等性事务Kafka 消息交付可靠性保障&#xff1a; Kafka 默认是&#xff1a;至少一次最多一次 (at most once) : 消息可能会丢失&#xff0c;但绝不会被重复发送至少一次 (at least once) : 消息不会丢失&#xff0c;但有可能被重复发送精确一次 (exact…...

JavaWeb--案例(Axios+JSON)

JavaWeb--案例&#xff08;AxiosJSON&#xff09;1 需求2 查询所有功能2.1 环境准备2.2 后端实现2.3 前端实现2.4 测试3 添加品牌功能3.1 后端实现3.2 前端实现3.3 测试1 需求 使用Axios JSON 完成品牌列表数据查询和添加。页面效果还是下图所示&#xff1a; 2 查询所有功能 …...

css制作动画(动效的序列帧图)

相信 animation 大家都用过很多&#xff0c;知道是 CSS3做动画用的。而我自己就只会在 X/Y轴 上做位移旋转&#xff0c;使用 animation-timing-function 规定动画的速度曲线&#xff0c;常用到的 贝塞尔曲线。但是这些动画效果都是连续性的。 今天发现个新功能 animation-timi…...

【设计模式】装饰器模式

装饰器模式 以生活中的场景来举例&#xff0c;一个蛋糕胚&#xff0c;给它涂上奶油就变成了奶油蛋糕&#xff0c;再加上巧克力和草莓&#xff0c;它就变成了巧克力草莓蛋糕。 像这样在不改变原有对象的基础之上&#xff0c;将功能附加到原始对象上的设计模式就称为装饰模式(D…...

Nginx配置实例-反向代理案例一

实现效果&#xff1a;使用nginx反向代理&#xff0c;访问 www.suke.com 直接跳转到本机地址127.0.0.1:8080 一、准备工作 Centos7 安装 Nginxhttps://liush.blog.csdn.net/article/details/125027693 1. 启动一个 tomcat Centos7安装JDK1.8https://liush.blog.csdn.net/arti…...

Java中IO流中字节流(FileInputStream(read、close)、FileOutputStream(write、close、换行写、续写))

IO流&#xff1a;存储和读取数据的解决方案 纯文本文件&#xff1a;Windows自带的记事本打开能读懂 IO流体系&#xff1a; FileInputStream&#xff1a;操作本地文件的字节输入流&#xff0c;可以把本地文件中的数据读取到程序中来 书写步骤&#xff1a;①创建字节输入流对象 …...

C#完全掌握控件之-combbox

无论是QT还是VC&#xff0c;这些可视化编程的工具&#xff0c;掌握好控件的用法是第一步&#xff0c;C#的控件也不例外&#xff0c;尤其这些常用的控件。常见控件中较难的往往是这些与数据源打交道的&#xff0c;比如CombBox、ListBox、ListView、TreeView、DataGridView. 文章…...

STL的空间配置器(allocator)

简答&#xff1a; 在CSTL中&#xff0c;空间配置器便是用来实现内存空间(一般是内存&#xff0c;也可以是硬盘等空间)分配的工具&#xff0c;他与容器联系紧密&#xff0c;每一种容器的空间分配都是通过空间分配器alloctor实现的。 解析: 1.两种C类对象实例化方式的异同在c中&a…...

linux系统莫名其妙的环境变量问题

今天使用Ubuntu20.04系统&#xff0c;使用less命令查看日志&#xff0c;发现日志中的“中文”显示为乱码&#xff1b; 使用vim命令查看该日志文件也显示为乱码&#xff1b; 使用more命令查看该日志文件则显示正常。 首先查询系统的字符集编码&#xff0c;发现编码正常支持中…...

使用 Microsoft Dataverse 简化的连接快速入门

重复昨天本地部署dynamics实例将其所有的包删除之后&#xff0c;再次重新下载回来。运行填写跟之前登陆插件一样的信息点击login 然后查看控制台&#xff0c;出现这样就说明第一个小示例就完成了。查看你的dy365平台下的 “我的活动”就可以看到刚刚通过后台代码创建的东西了。…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...