【C++干货基地】揭秘C++STL库的魅力:stiring的初步了解和使用


在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏: 《C++干货基地》《粉丝福利》

⛺️生活的理想,就是为了理想的生活!

引入

  哈喽各位铁汁们好啊,我是博主鸽芷咕《C++干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的城市有没有这种实惠又全面的零食基地呢?C++ 本身作为一门篇底层的一种语言,世面的免费课程大多都没有教明白。所以本篇专栏的内容全是干货让大家从底层了解C++,把更多的知识由抽象到简单通俗易懂。

⛳️ 推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

  • 引入
  • ⛳️ 推荐
  • 一、STL是什么?
  • 二、STL的六大组件
  • 三、我们为什么要学string?
    • 3.1 string 的定义
  • 四、string的常用接口使用
    • 4.1 成员函数
      • 构造函数
      • 拷贝构造
      • operator=
    • 4.2 迭代器的使用
      • string 的三种遍历方式
      • rbegin && rend
    • 4.3 容量部分
      • capacity 获取当前容量
      • size 获取当前存储了多少字符
      • resize 减少字符存储,或填充字符
      • reserve 为string扩容
      • clear 清空所有字符
      • empty 判断当前字符串是否为空
      • shrink_to_fit 为当前字符串请求缩容
    • 4.4 元素访问
      • operator[]
    • 4.5 修改
      • += 操作
      • append 追加字符或字符串
      • push_back 尾插
      • assign 替换字符串
      • insert 插入
      • erase 删除字符串的一部分,减少其长度
      • replace 替换
      • swap交换
    • 4.6 字符串的操作
      • find 查找字符或字符串
      • rfind 从后往前查找字符或字符串
      • c_str 返回C形式的字符串指针

一、STL是什么?

STL我相信各位学C++的肯定都不会陌生,C++自从模版出来之后就发生了革命性的意义。有了模版这个东西我们就可以只书写一个库来不给不同类型的数据使用。

在这里插入图片描述

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

二、STL的六大组件

在这里插入图片描述

STL主要是由四大组件组成的,前面说了STL 是一个包罗数据结构与算法的软件框架 其中里面的容器就是数据结构库含有各种常用的数据结构

  • 例如 顺序表 链表 队列 二叉树 等等常用数据结构
  • 其中今天介绍的string 其实也算是 STL 的一员是 存放字符的顺序表

但是由于历史原因,string是先出来的 STL 是后面由惠普实验室后开发出来开源所以人们并没有把string 归类到STL 之中。

三、我们为什么要学string?

在C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数。

  • 但是这些库函数与字符串是分离开的,不太符合OOP的思想.
  • 而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

所以在C++中 专门把字符串操作封装成了 string 容器,来给开发者更好的调用接口支持。不用去管理底层的空间分配使得使用更加省心。

3.1 string 的定义

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

在使用string类时,必须包含#include头文件以及using namespace std;

四、string的常用接口使用

4.1 成员函数

构造函数

构造函数介绍我们初始化string 对象的几种方法

  • 1. 构造空的string类对象,即空字符串
int main()
{string s1();return 0;
}
  • 2. 用C-string来构造string类对象
#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1 << endl;return 0;
}
  • 3.使用string 中的 pos 位置开始,n个字符开始构造
#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2(s1, 6, 4);cout << s2 << endl;return 0;
}
  • 4.使用 n 个字符初始化
#include<iostream>
using namespace std;int main()
{string s1(4,'x');cout << s1 << endl;return 0;
}

拷贝构造

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2(s1);cout << s2 << endl;return 0;
}

operator=

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2= s1;cout << s2 << endl;return 0;
}

4.2 迭代器的使用

迭代器是C++提供的一种新的遍历方式,其底层是一种类似指针的实现方式。可能很多人觉得这有什么可说的,但是迭代器不仅可以遍历string还能遍历二叉树链表是一种通用的遍历方式。

string 的三种遍历方式

  • 使用迭代器遍历
#include<iostream>
using namespace std;int main()
{string s1("hello gugu");//使用迭代器遍历string::iterator it1 = s1.begin();while (it1 != s1.end()){cout << *it1 << " ";it1++;}cout << endl;//使用迭代器修改string::iterator it2 = s1.begin();while (it2 != s1.end()){*it2 -= 1;cout << *it2 << " ";it2++;}cout << endl;return 0;
}
  • 使用方括号遍历 【】
#include<iostream>
using namespace std;int main()
{string s1("hello gugu");for (int i = 0; i < s1.size(); i++){cout << s1[i] << ' ';}cout << endl;return 0;
}
  • 使用范围 for 遍历
#include<iostream>
using namespace std;int main()
{string s1("hello gugu");for (auto e : s1){cout << e << ' ';}cout << endl;return 0;
}

rbegin && rend

这俩就是反向迭代器,使用他们打印出来的结果是从后往前

int main()
{string s1("hello gugu");//使用迭代器遍历string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << " ";++rit;}cout << endl;return 0;
}

4.3 容量部分

capacity 获取当前容量

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1.capacity() << endl;return 0;
}

size 获取当前存储了多少字符

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1.size() << endl;return 0;
}

resize 减少字符存储,或填充字符

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");s1.resize(3, 'x');cout << s1 << endl;s1.resize(5);cout << s1 << endl;return 0;
}

reserve 为string扩容

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1.capacity() << endl;s1.reserve(6);cout << s1.capacity() << endl;s1.resize(100);cout << s1.capacity() << endl;return 0;
}

clear 清空所有字符

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1 << endl;s1.clear();cout << s1 << endl;return 0;
}

empty 判断当前字符串是否为空

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1.empty() << endl;return 0;
}

shrink_to_fit 为当前字符串请求缩容

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1.capacity() << endl;s1.reserve(100);cout << s1.capacity() << endl;s1.shrink_to_fit();cout << s1.capacity() << endl;return 0;
}

4.4 元素访问

operator[]

```cpp
#include<iostream>
using namespace std;int main()
{string s1("hello gugu");for (int i = 0; i < s1.size(); i++){cout << s1[i] << ' ';}cout << endl;return 0;
}

4.5 修改

+= 操作

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2("xxxxx");s1 += s2;cout << s1 << endl;s1 += "vvvv";cout << s1 << endl;s1 += 'x';cout << s1 << endl;return 0;
}

append 追加字符或字符串

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2("xxxxx");s1.append(s2);cout << s1 << endl;s1.append("vvvv");cout << s1 << endl;s1.append(4,'c');cout << s1 << endl;s1.append("abcdef",3);cout << s1 << endl;return 0;
}

push_back 尾插

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");s1.push_back('x');cout << s1 << endl;return 0;
}

assign 替换字符串

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2("xxxxxxx");s1.assign(s2);cout << s1 << endl;s1.assign("Linux C++");cout << s1 << endl;s1.assign(5,'c');cout << s1 << endl;return 0;
}

insert 插入

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2("C++");s1.insert(6, s2);cout << s1 << endl;s1.insert(2, "xxxx");cout << s1 << endl;s1.insert(6, 2,'v');cout << s1 << endl;s1.insert(6,"bbbbbb",2);cout << s1 << endl;return 0;
}

erase 删除字符串的一部分,减少其长度

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.erase(5);cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}

replace 替换

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");s1.replace(5,1,"C++");cout << s1 << endl;return 0;
}

swap交换

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");string s2("C++ Linux");cout << s1 << endl;cout << s2 << endl;swap(s1, s2);cout << s1 << endl;cout << s2 << endl;return 0;
}

4.6 字符串的操作

find 查找字符或字符串

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");int pos = s1.find('g');cout << s1[pos];return 0;
}

rfind 从后往前查找字符或字符串

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");int pos = s1.rfind('g');cout << pos << endl;cout << s1[pos];return 0;
}

c_str 返回C形式的字符串指针

#include<iostream>
using namespace std;int main()
{string s1("hello gugu");cout << s1.c_str() << endl;return 0;
}

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

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

相关文章

分布式与一致性协议之ZAB协议(六)

ZAB协议 成员发现 成员发现是通过跟随者和领导者交互来完成的&#xff0c;目标是确保大多数节点对领导者的关系没有异议&#xff0c;也就是确立领导者的领导地位。成员发现的实现流程如图所示。 1.领导者选举结束&#xff0c;节点进入跟随者状态或者领导者状态后&#xff0…

SSH简介

概述 SSH&#xff0c;全称为Secure Shell&#xff0c;是一种网络协议&#xff0c;用于计算机之间的加密登录和其他加密网络服务。由Tatu Ylnen在1995年设计&#xff0c;旨在替代telnet、rlogin等不安全的协议&#xff0c;通过在网络中提供一种安全的远程登录方式来保护数据的安…

<网络安全>《80 概念讲解<第十三课 物联网常用协议-(有线通信)-设备连接>》

协议简称全称名称内容说明MBussymphonicmbus远程抄表系统是欧洲标准的2线的二总线&#xff0c;主要用于消耗测量仪器诸如热表和水表系列。USBUniversalSerialBus通用串行总线一个外部总线标准&#xff0c;用于规范电脑与外部设备的连接和通讯&#xff0c;是应用在PC领域的接口技…

【玩转Google云】构建安全高效的电商系统:GCP VPC 网络规划指南

在竞争激烈的电商领域,一个安全、高效且可扩展的网络基础架构至关重要。本文将深入探讨 Google Cloud Platform (GCP) 的 Virtual Private Cloud (VPC) 如何助力构建理想的电商系统。通过以一个典型的电商网站为例,我们将逐步解析 VPC 网络规划的关键步骤,包括子网划分、防火…

快速搭建linux虚拟机环境

1、虚拟机资源 VMwareWorkstation&#xff1a;Download VMware Workstation Pro virtualbox&#xff1a;Oracle VM VirtualBox 2、虚拟机系统资源 链接&#xff1a;系统资源链接 提取码&#xff1a;0gat 说明&#xff1a;此处的系统资源是采用VMwareWorkstation 虚拟机进…

提升图像识别性能:探索卷积神经网络与美国手语数据集

引言 在深度学习的世界里&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为了图像识别任务的主力军。继上一篇博客中我们使用基础神经网络对手写数字进行分类后&#xff0c;本文将介绍如何利用CNN的强大能力&#xff0c;对更加复杂的美国手语(ASL)数据集进行图像分…

简单两步将Lllama、Qwen等开源大模型安装到自己的电脑上

现在已经有非常多优秀的开源大语言模型了&#xff0c;比如Command R、Mistral、Qwen、MiniMax、Baichuan、Phi3等&#xff0c;其中Lllama3和Qwen等已经和GPT4的性能比较接近了。 如果能把这些免费的开源大模型部署到本地电脑或手机上&#xff0c;可以完全自由的使用&#xff0…

js之永久定时器

在JavaScript编程中&#xff0c;定时器是一种常见的工具&#xff0c;用于在指定的时间间隔内重复执行特定的代码。永久性定时器是其中一种类型&#xff0c;它会在设定的时间间隔内重复执行&#xff0c;直到被明确停止。本文将介绍如何在JavaScript中创建和使用永久性定时器。 …

嵌入式学习68-C++(运算符重载和虚函数)

知识零碎&#xff1a; cin >> n 相当于scanf C系统提供的6种基本函数 …

深入探索van Emde Boas树:原理、操作与C语言实现

van Emde Boas (vEB) 树是一种高效的数据结构&#xff0c;用于处理整数集合。它是由荷兰计算机科学家Jan van Emde Boas在1977年提出的。vEB树在处理整数集合的查找、插入、删除和迭代操作时&#xff0c;能够以接近最优的时间复杂度运行。vEB树特别适合于那些元素数量在某个较小…

【边东随笔】(2) “顶级掠食者” 的生存智慧:信心 | 狠心 | 耐心

&#xff08;北美鳄龟, Alligator Snapper&#xff09; "优雅&#xff0c;且致命。" 非常谨慎&#xff0c;在水域中会先找到躲避将自身安置于有利地形。浮出水面换气&#xff0c;水体稍有异动就会退回水中&#xff0c;优秀掠食者对自身优势牢牢的把握&#xff08; 信…

掌握Android Fragment开发之魂:Fragment的深度解析(中)

在上一篇文章中&#xff0c;我们深入探讨Fragment的核心特性、优势、生命周期&#xff0c;以及如何通过静态和动态使用Fragment。感兴趣的朋友&#xff0c;请前往查阅&#xff1a; 掌握Android Fragment开发之魂&#xff1a;Fragment的深度解析&#xff08;上&#xff09; 。 在…

hadoop学习---基于Hive的教育平台数据仓库分析案例(二)

衔接第一部分&#xff0c;第一部分请点击&#xff1a;基于Hive的教育平台数据仓库分析案例&#xff08;一&#xff09; 意向用户模块&#xff08;全量分析&#xff09;&#xff1a; 需求指标&#xff1a; 需求一: 计期内&#xff0c;新增意向客户&#xff08;包含自己录入的意…

AI学习指南线性代数篇-向量和矩阵

AI学习指南线性代数篇-向量和矩阵 在人工智能领域&#xff0c;线性代数是一门非常重要的数学基础课程&#xff0c;而向量和矩阵又是线性代数中最基础的概念之一。在本篇博客中&#xff0c;我们将深入探讨向量和矩阵的概述、在AI中的使用场景、定义和意义以及相关的公式讲解。 …

kraken2 最新版安装,极简模式

kraken2 git clone https://github.com/DerrickWood/kraken2.gitcd kraken2./install_kraken2.sh /opt/krakenvim .bashrc ---------------- # Kraken export PATH"/opt/kraken:$PATH" ----------------source .bashrc Note: 不晓得是不是我设置了清华源&#xff0c…

mysql相关知识点

1、将时间格式化为字符串 SELECT DATE_FORMAT(NOW(), %Y-%m-%d %H:%i:%s) 2、获取当前时间&#xff08;年、月、日、时、分、秒&#xff09; SELECT NOW() 或者 SELECT CURRENT_TIMESTAMP() ; 3、获取当前时间&#xff0c;精确到毫秒 SELECT NOW(3) 或者 SELECT CURRENT_…

下载源代码并交叉编译riscv FreeBSD系统和内核

RISCV系统曾经让人神秘到无法接触&#xff0c;交叉编译更是只有耳闻&#xff0c;现在随着RISCV的普及&#xff0c;它们神秘的面纱已经被慢慢揭开。 交叉编译作为RISCV系统中的一个重要环节&#xff0c;也随着RISCV的普及而变得更加容易理解和操作。交叉编译允许开发者在一个平…

LeetCode算法题:8.字符串转换整数 (atoi)

请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个字符&#xff08;假设还未到字符末…

Springboot开发开发技术以及易错点调整-21

了解IOC和DI Ioc(Inversion of Control)控制反转 在Java开发中&#xff0c;Ioc意味着将你设计好的对象交给容器控制&#xff0c;而不是传统的在你的对象内部直接控制。理解好Ioc的关键是要明白以下两点&#xff1a; 谁控制谁&#xff0c;控制什么&#xff1f;是由Ioc容器来控…

质数是无穷的吗?

质数是无穷的吗&#xff1f;还是存在一个最大的质数&#xff0c;一旦超过这个质数后&#xff0c;每个比它大的数都可以表示为我们已知质数的乘积&#xff1f;欧几里得本人最先提出这个问题&#xff0c;他以一种极其简单而优雅的方式&#xff0c;指出质数有无穷多个&#xff0c;…