【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…

快速搭建linux虚拟机环境

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

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

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

深入探索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; 信…

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

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

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…

下载源代码并交叉编译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;假设还未到字符末…

WordPress原创插件:当日24小时发布文章标题变红

WordPress原创插件&#xff1a;当日24小时发布文章标题变红 <?php// 添加自定义样式 function title_red_plugin_styles() {$current_time time();$post_time get_the_time(U);$time_difference $current_time - $post_time;if ($time_difference < 86400) {echo&l…

24_Scala集合Map

文章目录 Scala集合Map1.构建Map2.增删改查3.Map的get操作细节 Scala集合Map –默认immutable –概念和Java一致 1.构建Map –创建kv键值对 && kv键值对的表达 –创建immutable map –创建mutable map //1.1 构建一个kv键值对 val kv "a" -> 1 print…

Web3智能物联网:科技连接的未来世界

在当今科技飞速发展的时代&#xff0c;Web3智能物联网正逐渐成为人们关注的焦点。随着区块链技术的不断成熟和普及&#xff0c;以及物联网的普及和应用&#xff0c;Web3智能物联网作为二者的结合&#xff0c;将为未来的数字世界带来革命性的变化。本文将深入探讨Web3智能物联网…

二十、Java的反射机制

1、Java反射机制的概念 所谓反射从程序的运行结果来看也很好理解,即可以通过对象反射求出类的名称。如下: 正常方式:引入需要的“包.类”名称---->通过new实例化----->取得实例化对象。 反射方式:实例化对象---->getClass()方法------>得到完整的“包.类”名…

基于Django框架课堂投票系统的设计与实现

基于Django框架课堂投票系统的设计与实现 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 学生角色功能实现 注册登录界面 此处输入账号并设置登录密码&#xff0c;填写用户名、性别、生源地等相关信息…

视频断点上传

什么是断点续传 通常视频文件都比较大&#xff0c;所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大小没有限制&#xff0c;但是客户的网络环境质量、电脑硬件环境等参差不齐&#xff0c;如果一个大文件快上传完了网断了没有上传完成&#xf…

【busybox记录】【shell指令】tr

目录 内容来源&#xff1a; 【GUN】【tr】指令介绍 【busybox】【tr】指令介绍 【linux】【tr】指令介绍 使用示例&#xff1a; 转换字符 - 默认 转换字符 - 不翻译指定字符数组 此指令目前接触少&#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 驱动程序是最低层的一部…

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …

一篇迟来的未来展望的博客

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 老师布置的任务&#xff0c;叫写一篇博客&…

04.2.配置应用集

配置应用集 应用集的意思就是&#xff1a;将多个监控项添加到一个应用集里面便于管理。 创建应用集 填写名称并添加 在监控项里面找到对应的自定义监控项更新到应用集里面 选择对应的监控项于应用集