string

文章目录

  • 一. STL
    • 1.概念
    • 2.版本
  • 二. string类
    • 2.1 为什么学习string类
    • 2. 标准库中的string类
      • 2.2.1 构造(7个)
      • 2.2.2 对string类对象进行访问和修改
        • (1)operator[]
        • (2)迭代器
          • 1.迭代器的使用
          • 2.迭代器的价值(list)
        • (3)为什么有operator[]之后还需要迭代器
    • 补充的小知识点:auto
    • 补充的小知识点:范围for

一. STL

1.概念

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2.版本

  • 原始版本
    Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。
    P. J. 版本
    由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
    RW版本
    由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
    SGI版本
    由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

二. string类

2.1 为什么学习string类

  1. C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
    在这里插入图片描述

2. 标准库中的string类

  1. 首先,我们要学会看文档

在这里插入图片描述
.csdnimg.cn/direct/a73004d32d3d46f78cab8fd2b075f3e2.png)
在这里插入图片描述
string是在STL之前就设计出来了,所以比较复杂,总共有100多个接口(什么是接口,就是提供给我们,可以去调用的),但是我们只需要记住重要的20多个,剩下的使用时查询即可。

  1. 使用string类的时候,必须包含头文件#include<string>以及using namespace std(这个可以选择不写)
  2. string实际上是个模板,但是它的参数一定确定了,so我们不太用关注它。
  3. 先使用默认构造,构造一个空的字符串。
std::string str1;

2.2.1 构造(7个)

我们可以先简单看一看接口,进行猜测(它的参数的名字都是有意义的,所以猜测的还是很接近的)。具体的内容看下面的接口介绍
在这里插入图片描述
记住:initialize是初始化

在这里插入图片描述



在这里插入图片描述

规定:string的结尾一定是‘\0’结尾

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{//1.创建空的字符串string str1;   //构造空的string类对象str1//2.填充:string(size_t n, char c);string str2(5, 'r');  //用5个'r'初始化cout << str2 << endl;//3.copy--->string(const string & str);string str3(str2); //用str2初始化str3cout << str3 << endl;//4.from c-string--->string(const char* s);char s1[5] = "abcd";string str4(s1);  //用字符串s1初始化str4cout << str4 << endl;//5.将字符串s的地址传过来,复制n个它的字符:string (const char* s, size_t n);char s[4] = { 'a','b','c','d' };string str5(s, 3); //用字符串s的前三个字符初始化str5cout << str5 << endl;//注意:字符串传递过去默认也是首地址string str6("abcd", 3);  //常量(const)字符串的类型的地址是const char*cout << str6 << endl;//6.substring--->string(const string & str, size_t pos, size_t len = npos);string str7("abcdefghijklmn",14);string str8(str7, 3, 9);cout << str8 << endl;//如果没有写复制几个字符,则拷贝到str7结束string str9(str7, 3);cout << str9 << endl;return 0;
}

在这里插入图片描述

2.2.2 对string类对象进行访问和修改

(1)operator[]

在这里插入图片描述

std::string::operator[]的底层大致意思是:

class string
{
public:char& operator[](size_t pos){assert(pos < _size);//防止越界return _str[pos];}
private:char* _str;size_t _size;size_t _capacity;
};

它是用来返回pos这个位置的字符的别名。

接下来,如何使用operator方括号呢?

  1. 可以用来修改某个位置的字符(因为是引用返回,so可直接修改)
#include<stdio.h>
#include<iostream>
#include<assert.h>
#include<string>
using namespace std;
int main()
{//char& std::string::operator[](size_t pos)string str1("abcdefg");//str1.operator[](0)='p';str1[0] = 'p';std::cout << str1 << std::endl;return 0;
}
  1. 可用来遍历string的每个字符
int main()
{string str1("abcdefg");for (size_t i = 0; i < str1.size(); i++){cout << str1[i] << " ";}return 0;
}

循环遍历,将每个字符都加1

int main()
{string str1("abcdefg");for (size_t i = 0; i < str1.size(); i++){//将所有的字符都加1str1[i]++;}
  1. 可以很好的防止越界

在这里插入图片描述
这个返回值不可以被修改

(2)迭代器
1.迭代器的使用

在这里插入图片描述

像指针一样的东西,但并不是指针)

  1. 迭代器的使用
    在这里插入图片描述
    在这里插入图片描述

begin()返回第一个位置的迭代器
end()指的是最后一个有效字符的下一个位置(即\0)的迭代器(\0是标识字符,不是有效字符)

#include <iostream>
#include<stdio.h>
#include<assert.h>
#include<string>
using namespace std;
int main()
{string str1("hello world");//在string这个类里面,有iterator这个类型
//  类域  :: 类型      定义的对象    begin()返回第一个位置的迭代器string::iterator    it1 = str1.begin();while (it1 != str1.end())   //end()指的是最后一个字符的下一个位置//   不到最后一个\0{cout << *it1 << " ";  //it1是地址it1++;  //++就到下一个地址了,在解引用就是下一个字符}//在字符串打印完之后,换行cout << endl;return 0;
}

在这里插入图片描述
同样的,在遍历读取的时候,也可以修改数据。

while (it1 != str1.end())
{(*it1)++;cout << *it1 << " ";  it1++;  
}

如果像倒着遍历,则使用反向迭代器

2.迭代器的价值(list)

(链表的那个list,带头双向循环的链表)
list的遍历和修改只能借助迭代器,push_back等等
在这里插入图片描述

#include <iostream>
#include<stdio.h>
#include<assert.h>
#include<string>
#include<list>
using namespace std;
int main()
{list<int> lt1;lt1.push_back(9);lt1.push_back(8);lt1.push_back(7);lt1.push_back(6);//定义list的迭代器list<int>::iterator it1 = lt1.begin();while (it1 != lt1.end()){cout << *it1 << " ";it1++;}return 0;
}
(3)为什么有operator[]之后还需要迭代器

下标[]确实很方便,但并不是通用的。它只适用于string和vector(它们的底层是连续的物理空间)。

像链表等等,它们的结点的地址并没有什么大小关系。

补充的小知识点:auto

auto声明的变量:变量的类型由编译器在编译时期推导而得。(根据右边的值推导左边变量的类型)

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

int main()
{int i = 9;int j = i;//所以j的类型是int//用auto自动推导类型auto m = j;  //m的类型是intauto n = 1.2;//n的类型是doublereturn 0;
}

补充的小知识点:范围for

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

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

相关文章

B2B订货系统功能设计与代码开发(PHP + MySQL)

在B2B&#xff08;Business to Business&#xff09;电子商务中&#xff0c;企业之间的商品订购、交易和供应链管理是核心功能。一个高效的B2B订货系统可以帮助企业管理库存、订单、采购等业务流程。本文将介绍一个基于PHP与MySQL技术栈的B2B订货系统的功能设计与开发流程。 一…

【2024】前端学习笔记17-Vue初体验

学习笔记 1.什么是vue2.vue初体验3.代码拆分释义4.本文新内容1.什么是vue Vue是一个用于构建用户界面的渐进式JavaScript框架。 它专注于视图层,易于集成或与现有项目结合使用,也可以通过其生态系统实现更复杂的单页应用(SPA)。 Vue的核心特点包括响应式数据绑定、组件化开…

java动态代理

静态代理和动态代理 1、代理模式2、静态代理2.1 定义接口2.2 被代理对象实现2.3 代理对象2.4 客户端 3、JDK动态代理3.1 JDK动态代理例子3.1.1 定义接口3.1.2 被代理对象实现3.1.3 实现InvocationHandler接口3.1.4 创建代理对象 3.2 动态代理底层原理3.3 查看生成的代理类 4、C…

多线程的创建方式以及及Thread类详解

目录 一.线程的创建方法&#xff1a;&#xff08;重点&#xff09; 一&#xff1a;继承Thread类 写法一&#xff1a;正常写法 写法二&#xff1a;匿名内部类 二.实现Runnable接口 写法一&#xff1a;正常写法 写法二&#xff1a;匿名内部类 三. 实现 Callable 接口 ​…

408最后冲刺阶段,怎么做题才能考到120+?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 重要性排序如下&#xff1a;真题占据首位&#xff0c;紧随其后的是王道模拟题&#xff0c;王道书与题目则紧随其后&#xff0c;而408统考配套习题&#xff08;高教版&#xff09;与之大致相当。 真题&#xff0c;无疑…

如何对接低价又稳定的影视会员渠道?

对接低价折扣影视会员渠道通常涉及到与影视内容提供商或第三方分销商的合作。以下是一些基本步骤和注意事项&#xff0c;帮助你顺利对接这类渠道&#xff1a; 1. 市场调研 了解市场&#xff1a;研究市场上现有的影视会员服务提供商&#xff0c;包括价格、服务、用户反馈等。确…

crond 任务调度 (Linux相关指令:crontab)

相关视频链接 crontab 进行 定时任务 的设置 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务调度的分类&#xff1a; 1.系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等。 2.个别用户可能希望执行某些程序&#xff0c;比如…

顺序表+ArrayList

文章目录 一、基础知识1.1 数据结构类的继承图1.2 List 介绍1.3 线性表 二、数据结构 -- 顺序表2.1 什么是顺序表以及优缺点2.2 用数组实现顺序表细节解析代码 三、ArrayList3.1 Java中如何使用ArrayList3.2 ArrayList源码无参构造方法add方法扩容方法指定初始容量构造利用其他…

【工具变量】排污权交易政策试点DID(2000-2023)

数据简介&#xff1a;在过去几十年间的“高增长、高能耗、高污染”的经济发展背景下&#xff0c;随着社会各界不断反应高经济增长背后付出的巨大环境代价&#xff0c;中国ZF将节能环保减排纳入长期规划治理中。在2007年&#xff0c;我国开始启动了二氧化硫&#xff08;SO2&…

通用特效Shader

一、通用特效Shader介绍 1.1 什么是通用特效材质 Unity支持SRP Batcher后&#xff0c;使用UberShader的优势非常明显。所谓&#xff0c;UberShader&#xff0c;即一个超级Shader&#xff0c;覆盖一类功能&#xff0c;而不是多个分散的小Shader&#xff0c;比如一个通用特效Sh…

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

Golang--面向对象

Golang语言面向对象编程说明&#xff1a; Golang也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class)&#xff0c;Go语言的结构体(struct)和其…

英国留学论文写作中复合句式基础知识讲解

从句子的结构出发&#xff0c;复合句式是将两个以上的独立、完整的字句子通过coordinating conjunction或者分号连接在一起。因此&#xff0c;复合句式可以理解成为两个以上的简单句子组合在一起。下面英国翰思教育通过举例的方式&#xff0c;来介绍如何将独立的句子连接在一起…

从奇富科技,QQ钱包看信贷服务、贷款超市的的客户注册认证流程有什么不同

概览 奇富科技作为港股信贷第一企业&#xff0c;目前已服务2.4亿用户&#xff0c;是国内头部信贷科技服务平台。 QQ钱包&#xff0c;作为8亿用户的贷款超市&#xff0c;拥有其他贷款超市产品梦寐以求的流量入口。 产品模式 奇富科技作为信贷科技服务平台&#xff0c;主要提…

寻找伤感短视频素材 这些网站帮你轻松下载无水印资源

无论是制作情感类短视频&#xff0c;还是为抖音视频寻找合适的素材&#xff0c;伤感视频素材一直是创作者们关注的重点。如果你正在为如何找到高质量的伤感素材而困扰&#xff0c;那么今天我将推荐一些非常实用的素材网站&#xff0c;帮助你快速找到适合的伤感视频素材&#xf…

Java项目实战II基于Spring Boot的大学生智能消费记账系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今社会…

Linux 抓包工具 --- tcpdump

序言 在传输层 Tcp 的学习中&#xff0c;我们了解了 三次握手和四次挥手 的概念&#xff0c;但是看了这么多篇文章&#xff0c;我们也只是停留在 纸上谈兵。  欲知事情如何&#xff0c;我们其实可以尝试去看一下具体的网络包的信息。在这篇文章中将向大家介绍&#xff0c;在 L…

基于Spring Boot+Vue的养老院管理系统【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

基于SpringBoot+Vue音乐播放和推荐系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

震撼!通过双重异步,Excel 10万行数据导入从191秒优化到2秒!

震撼&#xff01;通过双重异步&#xff0c;Excel 10万行数据导入从191秒优化到2秒&#xff01; 在现代的企业级应用开发中&#xff0c;海量数据的处理效率和并发性能优化是一个非常重要的课题。无论是大规模数据导入、文件解析&#xff0c;还是在分布式系统中处理高并发任务&a…