C++:STL的引入和string类

2023-10-30

STL

STL是什么

什么是STL?STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

STL的六大组件

要学一个新知识,知道这个知识从大方向看有什么内容是必须的

六大组件主要如下所示

在这里插入图片描述
STL是C++的重要组成部分,如果把前面数据结构模拟实现的过程看成造轮子,那STL就是用前人创造好的轮子进行更高效率的工作
站在前人的肩膀上快速开发

那下面就开始学习string,学习新知识要有阅读文档的能力,有阅读文档的能力是必要的,本文及以后采用的是cplusplus的网站进行文本阅读和知识学习

string

在这里插入图片描述
上面是截取自该网站的内容信息,首先从中我们可以获取的信息有,string其实是typedef来的,是由basic_string来的,其次,标准string类通过类似于标准字节容器的接口提供了对此类对象的支持,但添加了专门设计用于操作单字节字符串的特性,前面也将到,string类是提供顺序字符的对象

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列

那既然string是一个类,那么就必然有类内的成员函数:

string类内成员函数

string类对象中,成员函数相当多,这里先写一些比较常用的

首先是构造函数:

在这里插入图片描述
下面是对构造函数的用法:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	char arr[] = { "hello world" };
	string s1;   // 构造空的string对象
	string s2(arr); // 用cstring构造string类对象
	string s3(10, 'a'); // 构造包含10个a的string类对象
	string s4(s2);  // 拷贝构造
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << endl;
	return 0;
}

其次是赋值重载

这是C++98的标准
在这里插入图片描述

在C++98的基础上,C++11又做出了新的改变,增加了新的赋值方式,但整体上还是利用C++98较多一些

在这里插入图片描述

访问元素的方式

在这里插入图片描述
从这里可以看出,运算符重载功能的强大,极大的增加了代码的可读性,以下面的例子来看:

int main()
{
	string s1 = "hello world";
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;
}

这里表面上看是和C语言中对字符串的遍历一样,事实上并不一样,这里使用的是运算符重载,增加了代码的可读性

下面是和容量相关的操作:
在这里插入图片描述

增删查改:

在这里插入图片描述

string方便的地方也体现在增删查改上,上面的函数都可以实现对string内内容的增删查改

迭代器

迭代器是STL中的重要组成部分,在几乎所有容器中,迭代器的用法相似,这里对迭代器进行重点介绍,其他容器的用法和这里是大差不差的

在这里插入图片描述
首先要看到迭代器是什么?迭代器的作用是什么?

如果从功能来看,迭代器可以理解成指针,利用指针来对string类内存储的数据进行多项操作,迭代器的作用可以对string类内成员进行成员访问,从而进行读和写等其他操作均有

这里首先看begin和end

int main()
{
	string s1 = "hello world";
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

上面是迭代器的用法,再看C语言中我们想要访问一个字符串是如何遍历的?

int main()
{
	char s1[] = { "hello world" };
	char* ptr = s1;
	while (*ptr)
	{
		cout << *ptr << " ";
		ptr++;
	}
	cout << endl;
}

从中也可以看出实际上,迭代器从功能来讲就是指针

这里需要注意迭代器的定义是如何定义的

在这里插入图片描述

在这里插入图片描述

对于不同的迭代器,定义的时候定义方法是不一样的

下面来看rbegin和rend,和前面不同,里面多了一个r,这个r的意思,实际上就是reverse,意思是反转,因此rbegin的意思就是反转着去读取数据

int main()
{
	string s1 = "hello world";
	string::iterator it = s1.begin();
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:STL的引入和string类 的相关文章

随机推荐

  • 【每日知识】使用git命令更新命令到远程仓库

    一 更新当前分支最新代码 1 如果本地当前分支设置了上游分支通过 git branch vv 查看 后运行 git pull 即可更新最新代码 2 如果没有设置上游分支可先设置上游分支 git branch u origin 分支名 再执行
  • TypeScript ---- 初识基础篇

    TypeScript 初识基础篇 写在前面 本篇文章篇幅有点长 适合正打算学习TS的小白 如果有一定基础的大神可以忽略本篇文章 文章并非完全原创 大部分内容都是从网上其他文章搬运过来的 再在其中添加上自己的一些理解和总结 如果有涉及侵权请联
  • C语言的基本结构(一)

    目录 1 C语言程序框架 1 1 程序编译的过程 1 2 C语言程序结构分析 1 C语言程序框架 C程序一般由头文件 主函数和函数三部分组成 从最简单的程序开始 对于大多数程序语言 第一个入门编程代码便是 Hello World 一步一步的
  • SQA在线聊天记录三:QA的职责要求和基本素质

    SQA在线聊天记录三 QA的职责要求和基本素质 2005 05 20 来自 CSDN管理频道 共有评论 条 发表评论 嘉宾主持Bluesky 这里涉及到一个问题 在招聘QA的时候 怎么看待QA人员具备的素质 CSDN的调查结果显示 47 的
  • 签名获取错误(错误: java.io.IOException: Invalid keystore format)签名中没打印出MD5信息

    安卓生成签名文件获取信息的小坑 首先我们通过AndroidStudio生成的签名文件 生成时使用的jdk是根据Studio配置的jdk版本 也就是说是根据下图 图一 中的jdk版本 假如这个jdk版本和电脑配置的环境变量的jdk 图二 不是
  • win10应用商店打不开,错误代码0x80131500

    我也突然遇到这个问题 一开始找各种方法也解决不了 然后在外网找到方法 很多人只是把代理开了 只要关了就可以了 这点不累述 都会提到 我的win10应用商店有两个错误代码0x80131500和0x80072efd 0x80131500错误会转
  • 粒子群算法优化策略总结

    粒子群算法优化策略总结 前言 1 对于惯性权重w的优化 1 1 引入混沌Sine映射构造非线性随机递增惯性权重 1 2 采用一种指数型的非线性递减惯性权重 1 3 分策略更改惯性权重 2 对于c1 c2的优化 2 1 引入正余弦函数来构造非
  • 永久一键关闭QQ频道,不用重新安装

    Step1 使用WMIC指令排查QQ相关进程 首先 按住Windows键 R键打开 运行 然后输入CMD 开启CMD工具 然后 输入如下指令 查找QQ相关的进程信息 由于我这里已经卸载了QQGuild 所以查找不到 wmic process
  • 解决VsCode 软件上方菜单栏消失问题

    当软件的页面出现这样的情况 菜单栏消失 变成三个横杠 不要慌 有方法解决 将鼠标放在此位置上 右键会出现选项 点击红色框选的项目 即可将工作区解锁出上方 这样菜单栏就会出现 如果还是没有将 菜单栏 弄出来 使用快捷键Ctrl Shift P
  • 做项目必读的vue3基础知识

    1 响应式 1 1 两者实现原理 vue2 利用es5的 Object defineProperty 对数据进行劫持结合发布订阅模式来实现 vue3 利用es6的 proxy 对数据代理 通过 reactive 函数给每一个对象都包一层 p
  • 华为p40android auto怎么用,华为手机无线投屏到车载导航,华为车机互联教程

    越来越多的车机系统可以与手机互联 不同的系统连接方式不一样 我们主要以华为手机与车机互联的教程说明 华为手机无线投屏到车载导航的方法 车型雷克萨斯18款ES200 手机是华为MATE8 安卓7 0版本 不同的品牌车型连接方式不一样 可以根据
  • String.ToCharArray()方法中的内存优化技巧

    原文发表于CSDN我的Blog http blog csdn net happyhippy archive 2006 10 29 1356088 aspx 先看下Reflector exe反汇编 net framework 2 0中Msco
  • DNS根服务器

    从抓包可以看出 DNS在传输层上使用了UDP协议 那它只用UDP吗 DNS的IPV4根域名只有13个 这里面其实有不少都部署在漂亮国 那是不是意味着 只要他们不高兴了 切断我们的访问 我们的网络就得瘫痪了呢 我们来展开今天的话题 DNS是基
  • PrintWriter out= response.getWriter()失效无法在前端弹出提示框以及乱码问题.

    PrintWriter out response getWriter 失效无法在前端弹出提示框 在后端想弹出提示框最简单的办法就是使用PrintWriter getWriter PrintWriter out response getWri
  • 使用ELK(ES+Logstash+Filebeat+Kibana)收集nginx的日志

    文章目录 引入logstash Nginx日志格式修改 配置logstash收集nginx日志 引入Redis 收集日志写入redis 从redis中读取日志 logstash解析自定义日志格式 引入Filebeat Filebeat简介
  • 七种性能测试方法

    根据在实际项目中的实践经验 我把常用的性能测试方法分为七大类 后端性能测试 Back end Performance Test 前端性能测试 Front end Performance Test 代码级性能测试 Code level Per
  • USB的阻抗匹配问题

    USB的阻抗匹配问题 USB特征阻抗90 总结 低速和全速时最好进行阻抗匹配 源端串联或终端并联90ohm 高速时不需要 USB 可以自动选择HS High Speed 高速 480 Mbps FS Full Speed 全速 12Mbps
  • 【SpringBoot】获取request请求参数,多次读取报错问题 (has already been called for this request)

    应用场景 因项目中接口请求时 需要对请求参数进行签名验证 当请求参数的body中有基本类型时 例 int long boolean等 因为基本类型如果没传值 序列化的时候会有默认值的问题 最后导致实际接口调用生成的签名和项目中进行校验的签名
  • adb通过TCP/IP连接提示 unable to connect to *, Connection refused的解决方法

    通过串口连接板子进入命令行 然后执行 su setprop service adb tcp port 5555 stop adbd start adbd
  • C++:STL的引入和string类

    文章目录 STL STL是什么 STL的六大组件 string string类内成员函数 迭代器 STL STL是什么 什么是STL STL是C 标准库的重要组成部分 不仅是一个可复用的组件库 而且是一个包罗数据结构与算法的软件框架 STL