当前位置: 首页 > news >正文

重学C++系列之STL库

一、什么是STL库

        STL是“Standard Template Library”的缩写,中文翻译为“标准模板库”。C++STL是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如字符串操作、链表、队列、栈。

        C++标准模板库的核心包括以下三个组件:

C++标准模板库组件
组件描述
容器(顺序容器、关联容器)容器是用来管理某一类对象的集合。C++提供了各种不同类型的容器,比如list, vector, map
算法算法作用于容器,提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作
迭代器迭代器用于遍历对象集合的元素。类似于指针

二、STL的使用案例

        1、可以去看官网的操作文档,C++中文参考手册

        2、字符串模板类string

                加上头文件#include <string>

#include <iostream>
#include <string>
using namespace std;int main()
{// 1、定义string s1("hello");string s2 = "world";cout << "s1 = " << s1 << endl;cout << "s2 = " << s2 << endl;// 2、赋值string s3 = s1;string s4 = s1 + s2;string s5 = s1;s5 += s2;cout << "s3 = " << s3 << endl;cout << "s4 = " << s4 << endl;cout << "s5 = " << s5 << endl;// 3、at, 返回某个位置的引用string s6 = s1;s6.at(0) = 'p';cout << "s6 = " << s6 << endl;// 4、容量string s7 = s1;cout << "s7.size() = " << s7.size() << endl;cout << "s7.capacity() = " << s7.capacity() << endl;cout << "s7.length() = " << s7.length() << endl;string s8 = s1+s1+s1+s1+s1+s1;cout << "s8.capacity1() = " << s8.capacity() << endl;// 5、第一个字符和最后一个字符cout << "s1第一个字符" << s1.front() << endl;cout << "s1最后一个字符" << s1.back() << endl;// 6、返回字符串类中,字符串的指针地址const char* s_data = s1.data();const char* s_str = s1.c_str();cout << "s_data = " << s_data << endl;cout << "s_str = " << s_str << endl;// 7、插入string s9 = s1;s9.insert(0, "abcd");s9.insert(2, "xyz");cout << "s9 = " << s9 << endl;// 8、[]s1[0] = 'x';cout << "s1 = " << s1 << endl;// 9、追加string s10 = s1;s10.push_back('+');s10.append("xyz");cout << "s10 = " << s10 << endl;// 10、查找int index = s1.find("o");cout << "index = " << index << endl;// 11、比较string s12 = "hello";if(s12 == "hello"){cout << "s12 == hello" << endl;}// 12、迭代器string s13 = "hello world";cout << "s13 = ";for(string::iterator it = s13.begin(); it != s13.end(); it++){cout << *it;}cout << endl;// 13、数值转换string s14 = "123456";int value = stoi(s14);cout << "value = " << value << endl;string s15 = to_string(value);cout << "s15 = " << s15 << endl;// 14、 获取子串string s16 = s13.substr(0, 5);cout << "s16 = " << s16 << endl;return 0;
}

        3、顺序容器vector

                  加上头文件#include <vector>

#include <iostream>
#include <vector>
using namespace std;struct node 
{char *name;void func(){}
};int main()
{vector<int> myvector;// 1、插入myvector.push_back(10);myvector.push_back(20);myvector.push_back(30);myvector.push_back(40);myvector.push_back(50);// 2、迭代器遍历vector<int>::iterator it;for(it = myvector.begin(); it != myvector.end(); it++){cout << *it << '\t';}cout << endl;// 3、删除cout << "after del:" << endl;myvector.pop_back();myvector.pop_back();// 4、容量cout << "size = " << myvector.size() << endl;// 5、使用数组形式遍历for(int i = 0; i < myvector.size(); i++){cout << myvector.at(i) << '\t';}cout << endl;return 0;
}

        4、双向链表容器list

                 加上头文件#include <list>

#include <iostream>
#include <list>using namespace std;class Student
{
private:string name;int age;int score;
public:Student(string name = string(), int age = 18, int score = 30){this->age = age;this->name = name;this->score = score;}void show(){cout << name << '\t' << age << '\t' << score << endl;}friend bool cmp(const Student &s1, const Student &s2);string getName()const{return name;}void setAge(int Age){this->age = Age;}
};bool cmp(const Student &s1, const Student &s2)
{return s1.score > s2.score;
}int main()
{list<Student> mylist;// 插到后面,尾插mylist.push_back(*(new Student("zhang3", 20, 90)));mylist.push_back(*(new Student("zhang4", 21, 79)));// 插到前面,头插mylist.push_front(*(new Student("zhang7", 19, 89)));mylist.push_front(*(new Student("zhang8", 25, 80)));// 遍历,用迭代器cout << "before sort" << endl;list<Student>::iterator it;for(it = mylist.begin(); it != mylist.end(); it++){it->show();}// 排序mylist.sort(cmp);   // cmp函数是自定义的排序内容cout << "after sort" << endl;for(it = mylist.begin(); it != mylist.end(); it++){it->show();}// 删除it = mylist.begin();it = mylist.erase(it);cout << "after del first" << endl;for(it = mylist.begin(); it != mylist.end(); it++){it->show();}// 查找和修改for(it = mylist.begin(); it != mylist.end(); it++){if(it->getName() == "zhang7"){cout << "find zhang7" << endl;it->setAge(50);}}for(it = mylist.begin(); it != mylist.end(); it++){it->show();}return 0;
}

5、栈容器stack

#include <iostream>
#include <stack>using namespace std;int main()
{stack<int> mystack;// 入栈mystack.push(10);mystack.push(20);mystack.push(30);mystack.push(40);mystack.push(50);// 栈的元素个数cout << "size:" << mystack.size() << endl;// 栈没有空,就一直出栈int data;while(!mystack.empty()){data = mystack.top();   // 出栈前需要先获取栈顶元素mystack.pop();cout << data << "\t";}cout << endl;return 0;
}

6、队列容器queue

#include <iostream>
#include <queue>using namespace std;int main()
{queue<int> myqueue;// 入队myqueue.push(10);myqueue.push(20);myqueue.push(30);myqueue.push(40);myqueue.push(50);// 获取队列的元素个数 cout << "size: " << myqueue.size() << endl;// 队头元素cout << "front: " << myqueue.front() << endl;// 队尾元素cout << "back: " << myqueue.back() << endl;// 遍历int data;while(!myqueue.empty()){data = myqueue.front();myqueue.pop();  // 从队头出队的,先要保留队头元素cout << data << "\t";}cout << endl;return 0;
}

7、关联容器map 

#include <iostream>
#include <map>using namespace std;int main()
{// map是以键值对的方式存放数据// 第一个类型是键,第二类型是值,其中键不一定是整形可以是字符串map<int, string> mymap1;// 插入或者访问,键不一定要连续mymap1[1] = "a";mymap1[2] = "b";mymap1[10] = "c";mymap1[100] = "d";for(map<int, string>::iterator it = mymap1.begin(); it != mymap1.end(); it++){// 键用first来访问,值用second来访问// 不允许使用cout << it << endl; 来访问cout << it->first << " = " << it->second << endl;}// 不一定要连续map<string, string> mymap2;mymap2["zhang3"] = "123";mymap2["li4"] = "124";mymap2["wang5"] = "45";mymap2["hong6"] = "4543";for(map<string, string>::iterator it = mymap2.begin(); it != mymap2.end(); it++){// 键用first来访问,值用second来访问cout << it->first << " = " << it->second << endl;}return 0;
}

三、总结

        以上就是STL库中常用的容器以及对应的操作,使用时需要添加对应的头文件名,同时不同容器之间的有些相同操作是同名的,具体更多细节可以去看看官网的中文参考手册。

相关文章:

重学C++系列之STL库

一、什么是STL库 STL是“Standard Template Library”的缩写&#xff0c;中文翻译为“标准模板库”。CSTL是一套功能强大的C模板类&#xff0c;提供了通用的模板类和函数&#xff0c;这些模板类和函数可以实现多种流行和常用的算法和数据结构&#xff0c;如字符串操作、链表、队…...

JAVA SE -- 第十四天

&#xff08;全部来自“韩顺平教育”&#xff09; 泛型 一、泛型 1、基本介绍 ①泛型又称参数类型&#xff0c;是Jdk5.0出现的新特性&#xff0c;解决数据类型的安全性问题 ②在类声明或实例化时只要指定好需要的具体的类型即可 ③Java泛型可以保证如果程序在编译时没有发…...

微信小程序监测版本更新

在index.js里面 不放到app.js里面是因为有登录页面&#xff0c;在登录页面显示更新不太友好 onShow() {const updateManager wx.getUpdateManager()// 请求完新版本信息的回调updateManager.onCheckForUpdate(res > {if (res.hasUpdate) {// 新版本下载成功updateManage…...

《Java面向对象程序设计》学习笔记——第 2 章 基本数据类型、数组和枚举类型

专栏&#xff1a;《Java面向对象程序设计》学习笔记...

TDesign中后台管理系统-访问后端服务

目录 1 修改后端服务地址2 解决跨域问题3 动态获取菜单4 测试后端接口5 前后端联调总结 目前我们已经搭建了TDesign的前端和express的后端&#xff0c;目前是两个独立的应用。通常我们需要把前后端集成在一起&#xff0c;TDesign已经配置了相关的信息&#xff0c;只需要修改后端…...

【机器学习】Gradient Descent for Logistic Regression

Gradient Descent for Logistic Regression 1. 数据集&#xff08;多变量&#xff09;2. 逻辑梯度下降3. 梯度下降的实现及代码描述3.1 计算梯度3.2 梯度下降 4. 数据集&#xff08;单变量&#xff09;附录 导入所需的库 import copy, math import numpy as np %matplotlib wi…...

ElasticSearch基础篇-Java API操作

ElasticSearch基础-Java API操作 演示代码 创建连接 POM依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…...

解决uniapp的tabBar使用iconfont图标显示方块

今天要写个uniapp的移动端项目&#xff0c;底部tabBar需要添加图标&#xff0c;以往都是以图片的形式引入&#xff0c;但是考虑到不同甲方的主题色也不会相同&#xff0c;使用图片的话&#xff0c;后期变换主题色并不友好&#xff0c;所以和UI商量之后&#xff0c;决定使用icon…...

UE4/5C++多线程插件制作(0.简介)

目录 插件介绍 插件效果 插件使用 English 插件介绍 该插件制作&#xff0c;将从零开始&#xff0c;由一个空白插件一点点的制作&#xff0c;从写一个效果到封装&#xff0c;层层封装插件&#xff0c;简单粗暴的对插件进行了制作&#xff1a; 插件效果 更多的是在cpp中去…...

ChatFile实现相关流程

文本上传构建向量库后台库的内容 调用上传文件接口先上传文件 存在疑问:暂时是把文件保存在tmp文件夹,定时清理,是否使用云存储 根据不同的文件类型选取不同的文件加载器加载文件内容 switch (file.mimetype) {case application/pdf:loader new PDFLoader(file.path)breakc…...

15 文本编辑器vim

15.1 建立文件命令 如果file.txt就是修改这个文件&#xff0c;如果不存在就是新建一个文件。 vim file.txt 使用vim建完文件后&#xff0c;会自动进入文件中。 15.2 切换模式 底部要是显示插入&#xff0c;是编辑模式&#xff1b; 按esc&#xff0c;底部要是空白的&#xff0…...

如何运行疑难解答程序来查找和修复Windows 10中的常见问题

如果Windows 10中出现问题&#xff0c;运行疑难解答可能会有所帮助。疑难解答人员可以为你找到并解决许多常见问题。 一、在控制面板中运行疑难解答 1、打开控制面板&#xff08;图标视图&#xff09;&#xff0c;然后单击“疑难解答”图标。 2、单击“疑难解答”中左上角的…...

程序员成长之路心得篇——高效编码诀窍

随着AIGC的飞速发展&#xff0c;程序员越来越能够感受到外界和自己的压力。如何能够在AI蓬勃发展的时代不至于落后&#xff0c;不至于被替代&#xff1f;项目的开发效率起了至关重要的作用。 首先提出几个问题&#xff1a; 如何实现高效编程?高效编程的核心在于哪里&#xff…...

matlab使用教程(6)—线性方程组的求解

进行科学计算时&#xff0c;最重要的一个问题是对联立线性方程组求解。在矩阵表示法中&#xff0c;常见问题采用以下形式&#xff1a;给定两个矩阵 A 和 b&#xff0c;是否存在一个唯一矩阵 x 使 Ax b 或 xA b&#xff1f; 考虑一维示例具有指导意义。例如&#xff0c;方程 …...

Verilog语法学习——边沿检测

边沿检测 代码 module edge_detection_p(input sys_clk,input sys_rst_n,input signal_in,output edge_detected );//存储上一个时钟周期的输入信号reg signal_in_prev;always (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)signal_in_prev < 0;else…...

springboot和springcloud的联系与区别

什么是springboot&#xff1f; Spring Boot是一个用于简化Spring应用程序开发的框架&#xff0c;它提供了一种约定优于配置的方式&#xff0c;通过自动配置和快速开发能力&#xff0c;可以快速搭建独立运行、生产级别的Spring应用程序。 在传统的Spring应用程序开发中&#xf…...

【Web开发指南】如何用MyEclipse进行JavaScript开发?

由于MyEclipse中有高级语法高亮显示、智能内容辅助和准确验证等特性&#xff0c;进行JavaScript编码不再是一项繁琐的任务。 MyEclipse v2023.1.2离线版下载 JavaScript项目 在MyEclipse 2021及以后的版本中&#xff0c;大多数JavaScript支持都是开箱即用的JavaScript源代码…...

【C++进阶】多态

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…...

决策树的划分依据之:信息增益率

在上面的介绍中&#xff0c;我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性&#xff0c;则根据信息增益公式可计算出它的信息增益为 0.9182&#xff0c;远大于其他候选划分属性。 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就…...

SolidUI社区-独立部署 和 Docker 通信分析

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...