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

news2024/11/24 23:49:32

在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏: 《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.coloradmin.cn/o/1651538.html

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

相关文章

AI大模型探索之路-训练篇17:大语言模型预训练-微调技术之QLoRA

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

动态规划——路径问题:LCR 166.珠宝的最高价值

文章目录 题目描述算法原理1.状态表示&#xff08;题目经验&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;LCR 166.珠宝的最高价值 算法原理 1.状态表示&#xff08;题目经验&#xff09; 对于这种路径类的问题&…

Linux中动态库的用法及优缺点?怎样制作动态库和静态库?

一、什么是gcc gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;现在除了c语言&#xff0c;还支持C、java、Pascal等语言。gcc支持多种硬件平台. 在 Linux…

在做题中学习(52): 山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;O(logn)的时间复杂度&#xff0c;很可能是二分法&#xff0c;再看看有没有二段性&#xff1a; 由题目可以知道&#xff0c;i的左边比i小&#xff0c;右边比i大&am…

47.Redis学习笔记

小林coding -> 图解redis的学习笔记 文章目录 Rediswindwos安装docker安装redis启动redis使用RDM访问虚拟机中的redispython连接redis缓存穿透、击穿、雪崩基本数据类型高级数据类型高并发指标布隆过滤器分布式锁Redis 的有序集合底层为什么要用跳表&#xff0c;而不用平衡…

Spring_概述

Spring 官网Spring Framework&#xff08;Spring&#xff09;文档位置重点内容Overview 官网 Spring官网 Spring Framework&#xff08;Spring&#xff09; 文档位置 重点 IoC容器AOP&#xff1a;面向切面编程AOT&#xff1a;ahead of time&#xff0c;提前编译Web 框架&…

面试分享——订单超30分钟未支付自动取消用什么实现?如何使用Redis实现延迟队列?

目录 1.订单超时未支付自动取消&#xff0c;这个你用什么方案实现&#xff1f; 2.如何使用Redis实现延迟队列 2.1实验步骤 2.2实现生产可用的延迟队列还需关注什么 3.总结 电商场景中的问题向来很受面试官的青睐&#xff0c;因为业务场景大家都相对更熟悉&#xff0c;相关…

金仓面对面 | 人大金仓×安硕信息共话金融信用风险管理数字化转型之道

金仓面对面 在数字化浪潮的推动下&#xff0c;人大金仓携手行业先锋&#xff0c;共同开启一场关于创新与转型的思想盛宴——金仓面对面。这不仅是一场对话&#xff0c;更是一次智慧的火花碰撞&#xff0c;一次行业数字化转型洞察的深度挖掘。 行业精英汇聚&#xff1a;我们荣幸…

SSH的魅力:为何它成为远程访问的首选

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、SSH简介 2、SSH的历史与发展 3、SSH的主要用…

大学物理实验 期末复习笔记整理(个人复习笔记/侵删/有不足之处欢迎斧正)

一、误差和数据处理 1. 系统误差是指在重复性条件下&#xff0c;对同一被测量进行无限多次测量所得结果的平均值与被测量的真值之差。它通常是由于测量设备、测量方法或测量环境等因素引起的&#xff0c;具有重复性、单向性和可测性。而随机误差则是由于测量过程中一系列有关因…

CP AUTOSAR之CANXL Driver详细说明(正在更新中)

本文遵循autosar标准&#xff1a;R22-11 1 简介及功能概述 本规范描述了AUTOSAR 基础软件模块CAN XL 驱动程序的功能、API和配置。   本文档的基础是[1,CiA610-1]和[2,CiA611-1]。假设读者熟悉这些规范。本文档不会再次描述CAN XL 功能。   CAN XL 驱动程序是最低层的一部…

NETBIOS和DNS

Netbios NETBIOS只能工作在局域网。 NetBIOS&#xff08;Network Basic Input/Output System, 网络基本输入输出系统&#xff09;是一种接入服务网络的接口标准。主机系统通过WINS服务、广播及lmhosts文件多种模式&#xff0c;把NetBIOS名解析对应的IP地址&#xff0c;实现信…

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具&#xff1a;OpenSSL&#xff0c;gpg&#xff08;是pgp的实现&#xff09; 加密算法和协议&#xff1a; 对称加密&#xff1a;加解密使用同一个秘钥&#xff1b; DES&#xff1a;Data Encryption Standard&#xff0c;数据加密标准&…

最后一块石头的重量 II ,目标和,一和0

最后一块石头的重量 II&#xff08;0-1背包问题 将石头尽可能分为两堆重量一样的&#xff0c;进行相撞则为0 class Solution {public int lastStoneWeightII(int[] stones) {int sum0;for(int x:stones){sumx;}int targetsum/2;int[] dpnew int[target1];//dp[j]表示最大石堆的…

kubeflow简单记录

kubeflow 13.7k star 1、Training Operator 包括PytorchJob和XGboostJob&#xff0c;支持部署pytorch的分布式训练 2、KFServing快捷的部署推理服务 3、Jupyter Notebook 基于Web的交互式工具 4、Katib做超参数优化 5、Pipeline 基于Argo Workflow提供机器学习流程的创建、编排…

上海亚商投顾:沪指窄幅震荡 两市成交额跌破万亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量震荡&#xff0c;深成指、创业板指小幅调整&#xff0c;黄白二线分化明显。合成生物概念反复活跃…

网络安全之动态路由RIP详解

RIP&#xff1a;路由信息协议 RIP分为三个版本&#xff1a;RIPV1,RIPV2&#xff08;在IPv4中使用&#xff09;,RIPNG&#xff08;在IPv6中使用&#xff09; RIPV1是一种有类别的距离矢量型路由协议&#xff08;不传递网络掩码&#xff09;。 RIPV2是一种无类别的距离矢量型路…

【机器学习】自然语言引导下的单目深度估计:泛化能力与鲁棒性的新挑战

自然语言引导下的单目深度估计&#xff1a;泛化能力与鲁棒性的新挑战 一、自然语言引导下的单目深度估计进展二、泛化能力与鲁棒性的挑战三、评估方法与实验验证四、代码实例与未来展望 在人工智能领域&#xff0c;单目深度估计一直是一个备受关注的热点问题。通过单张图片推断…

IIoT:数据融合在工业物联网中的应用——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断发展&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经逐渐渗透到各个行业&#xff0c;为企业的生产和管理带来了前所未有的便利。 然而&#xff0c;与此同时&#xff0c;海量的数据也为企业带来了挑战。如何将这些…