C++ STL 学习指南:带你快速掌握标准模板库

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟

 

大家好呀!🤗 今天我们来聊一聊 C++ 程序员的必备神器——STL(Standard Template Library,标准模板库)。如果你是 C++ 初学者或者还没深入了解过 STL 的朋友,这篇文章将带你快速入门,揭开 STL 的神秘面纱!😎

 你是否觉得自己在 C++ 中经常需要实现一些重复的代码,比如排序、查找数据、动态数组扩容等等? 如果你也有这样的烦恼,那么 STL 可以完美解决这些问题!它能够极大地简化我们的代码,减少不必要的工作量,同时提高开发效率。💡


目录

什么是 STL?🔍

一、容器(Containers):你的数据储物箱 🧰

1. vector:动态数组 💡

vector的实战案例 📊

2. list:双向链表 🔗

list的妙用

3. map:键值对存储 🗂️

使用 map 进行数据统计

4. unordered_map:哈希表 🧩

5. stack 和 queue:方便的数据处理 🍰

二、算法(Algorithms):高效的代码助推器 🏎️

1. 排序与查找:sort 和 find 🌠

2. 统计与累加:count 和 accumulate 📊

3. 自定义操作:for_each 函数 ✨

三、迭代器(Iterators):容器与算法的桥梁 🌉

迭代器的种类

迭代器的实际应用 🚀

四、总结:STL 的使用技巧 🌟


什么是 STL?🔍

STL 是 C++ 的标准库之一,包含了一系列 模板类函数模板,主要用于提供通用的数据结构和算法。简单来说,STL 就是帮你解决“重复造轮子”的问题,让你更专注于实现逻辑,而不是耗费时间在基础数据结构的实现上。

STL 包含了三个核心组件:

  1. 容器(Containers) 🚀:用于存储数据的集合,比如 vectorlistmap 等。
  2. 算法(Algorithms) 🛠️:常用算法的集合,比如排序、查找、遍历等。
  3. 迭代器(Iterators) 🔄:连接容器与算法的“桥梁”,用于遍历容器内的元素。

接下来,我们将依次了解这些组件,看看 STL 是如何让编程变得更轻松的!🌈


一、容器(Containers):你的数据储物箱 🧰

容器是 STL 的核心部分,提供了多种数据存储结构。每种容器都有各自的特点和适用场景,以下是一些常见的容器:

1. vector:动态数组 💡

vector 是一种动态数组,可以根据需要自动扩展容量。它的特点是 支持随机访问,并且在末尾添加和删除元素的效率很高。

vector的实战案例 📊
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3};vec.push_back(4);  // 在末尾添加元素vec.push_back(5);vec[1] = 10;       // 修改第二个元素for (int num : vec) {std::cout << num << " ";}return 0;
}

 

适用场景:当你需要频繁读取某个位置的元素时,vector 是首选!✨

注意事项vector 的扩容是成倍增长的,因此它有时会多分配一些内存来应对未来的增长。如果能提前知道数据量的大小,最好使用 reserve() 减少扩容带来的性能开销。

2. list:双向链表 🔗

list 是双向链表,适合在任意位置进行插入和删除操作。与 vector 不同的是,它不支持随机访问,因此访问某个特定位置的元素效率较低。

list的妙用
#include <list>
#include <iostream>int main() {std::list<int> lst = {1, 2, 3};lst.push_front(0);  // 在开头添加元素lst.push_back(4);   // 在末尾添加元素lst.insert(++lst.begin(), 100);  // 在第二个位置插入 100for (int num : lst) {std::cout << num << " ";}return 0;
}

 

适用场景:如果你的程序需要频繁插入和删除元素,而对随机访问的需求不高,list 会是更好的选择!😉

实际体验:在某些情况下,使用list 进行插入操作的代码比 vector 更加简洁和高效,尤其是在需要频繁的插入和删除操作时。

3. map:键值对存储 🗂️

map 是一种关联容器,基于红黑树实现,可以用来存储键值对(key-value)。map 自动对键进行排序,并且不允许键重复。

使用 map 进行数据统计
#include <map>
#include <iostream>int main() {std::map<std::string, int> ages;ages["Alice"] = 25;ages["Bob"] = 30;ages["Charlie"] = 22;// 输出所有人的年龄for (const auto& pair : ages) {std::cout << pair.first << ": " << pair.second << "\n";}return 0;
}

适用场景:当你需要根据键快速查找对应值时,map 是一个非常方便的选择!✨

个人经验分享:如果你的程序需要频繁修改数据,可以选择 unordered_map,它的查找效率更高,但不保证有序性。

4. unordered_map:哈希表 🧩

unordered_map 类似于 map,但是它使用哈希表实现,因此查找速度在平均情况下更快。它不保证元素的顺序。

使用unordered_map 的小窍门unordered_map 使用的是哈希函数,因此如果你的键是自定义类型,请记得实现适当的哈希函数,否则可能会出现编译错误。

5. stack queue:方便的数据处理 🍰

stack queue 是两种特殊的容器适配器,分别实现了 后进先出(LIFO)和 先进先出(FIFO)的数据处理模式。

示例代码:

#include <stack>
#include <queue>
#include <iostream>int main() {std::stack<int> stk;stk.push(1);stk.push(2);stk.push(3);while (!stk.empty()) {std::cout << stk.top() << " ";stk.pop();}std::queue<int> que;que.push(1);que.push(2);que.push(3);while (!que.empty()) {std::cout << que.front() << " ";que.pop();}return 0;
}

适用场景stack 适用于需要处理递归或回退逻辑的场景,而 queue 适用于按顺序处理数据的情况,例如任务排队。 


二、算法(Algorithms):高效的代码助推器 🏎️

STL 的算法库提供了丰富的工具,使得编程变得更加简单。你可以使用这些算法来处理容器中的数据,而不用重复编写类似的逻辑代码。

1. 排序与查找:sortfind 🌠

  • sort():可以轻松对容器进行排序。
  • find():在容器中查找指定元素。

 示例代码:

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};std::sort(vec.begin(), vec.end()); // 排序auto it = std::find(vec.begin(), vec.end(), 9); // 查找if (it != vec.end()) {std::cout << "Found: " << *it << "\n";} else {std::cout << "Not found\n";}return 0;
}

 

亲身体验:使用 STL 的算法库,可以让你把更多精力放在业务逻辑上,而不是实现底层算法,这就是 STL 的魅力所在。🔥

2. 统计与累加:countaccumulate 📊

  • count():统计某个元素在容器中出现的次数。
  • accumulate():累加容器中的元素。
#include <vector>
#include <numeric> // 包含 accumulate
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 3, 2, 3};int count3 = std::count(vec.begin(), vec.end(), 3); // 统计3的数量int sum = std::accumulate(vec.begin(), vec.end(), 0); // 求和std::cout << "Number of 3s: " << count3 << "\n";std::cout << "Sum: " << sum << "\n";return 0;
}

3. 自定义操作:for_each 函数 ✨

for_each 函数可以帮助你对容器中的每个元素进行自定义操作,比如打印每个元素、改变它们的值等等。

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::for_each(vec.begin(), vec.end(), [](int& num) {num *= 2; // 将每个元素乘以2std::cout << num << " ";});return 0;
}
v

 应用场景:如果你有特定的逻辑想要应用到容器中的每个元素,for_each 非常好用,可以用 Lambda 表达式让代码更加简洁。

 


三、迭代器(Iterators):容器与算法的桥梁 🌉

迭代器是 STL 的精髓,它让你可以方便地遍历容器中的元素,同时与 STL 的算法进行无缝配合。

迭代器的种类

  • 输入迭代器(Input Iterator):只读。
  • 输出迭代器(Output Iterator):只写。
  • 前向迭代器(Forward Iterator):可读写,可向前遍历。
  • 双向迭代器(Bidirectional Iterator):可向前和向后遍历。
  • 随机访问迭代器(Random Access Iterator):支持随机访问,类似指针。

迭代器的实际应用 🚀

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用正向迭代器for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << "\n";// 使用反向迭代器for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {std::cout << *rit << " ";}return 0;
}

 经验分享:通过熟练掌握迭代器,你可以实现对各种容器的灵活操作,使代码更加优雅、简洁。迭代器甚至可以用来实现自定义算法,非常强大!💪

 


四、总结:STL 的使用技巧 🌟

在日常开发中,合理使用 STL 可以大幅提升代码的效率和简洁性。以下是一些 STL 使用的小技巧:

  1. 选择合适的容器:根据需求选择合适的容器,比如频繁访问使用 vector,频繁插入删除使用 list,键值对查找使用 map
  2. 使用算法库:STL 中的算法库包含了常用的排序、查找、计算等函数,避免重复造轮子!
  3. 掌握迭代器:迭代器是 STL 的精髓,熟练掌握迭代器可以使你的代码更灵活、更高效。
  4. 预分配容量:对于 vector,如果可以预知数据量,使用 reserve() 预分配容量可以减少扩容带来的性能损耗。
  5. 注意迭代器失效:某些操作(如在 vector 中插入或删除元素)会导致迭代器失效,务必小心处理。

希望通过这篇文章,大家对 C++ 的 STL 有了一个初步了解!🎉 STL 是 C++ 中非常强大的一部分,如果你能熟练使用 STL,将会让你的编程效率提升一大步!🚀

别忘了给文章点个赞👍,让更多人了解 STL 的魅力吧!如有问题,欢迎在评论区交流讨论!😊

 欢迎关注我👉【A Charmer】

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

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

相关文章

Oracle视频基础1.3.5练习

Oracle视频基础1.3.4练习 1.3.5 检查数据库启动状态 ps -ef | grep oracle ipcs clear演示alter向前向后改database阶段 sqlplus /nolog conn / as sysdba startup mount alter database nomount # 报错 alter database open启动restricted mode&#xff0c;创建一个connect&…

Unity3D包管理bug某些版本Fbx Exporter插件无法搜索到的问题

这个问题是在使用unity的时候发现的 有些版本里没有Fbx Exporter插件也是没法搜到 经过测试&#xff0c;在package manager中开启Enable Preview Packages也没有用 这个插件在2020已经是正式版了&#xff0c;不需要再开启 后来发现可能是版本bug 需要手动开启 在工程的Pac…

深度学习-学习率调整策略

在深度学习中&#xff0c;学习率调整策略&#xff08;Learning Rate Scheduling&#xff09;用于在训练过程中动态调整学习率&#xff0c;以实现更快的收敛和更好的模型性能。选择合适的学习率策略可以避免模型陷入局部最优、震荡不稳定等问题。下面介绍一些常见的学习率调整策…

Caffeine 手动策略缓存 put() 方法源码解析

BoundedLocalManualCache put() 方法源码解析 先看一下BoundedLocalManualCache的类图 com.github.benmanes.caffeine.cache.BoundedLocalCache中定义的BoundedLocalManualCache静态内部类。 static class BoundedLocalManualCache<K, V> implements LocalManualCache&…

《Qwen2-VL》论文精读【上】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当

1、论文地址Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution 2、Qwen2-VL的Github仓库地址 该论文发表于2024年4月&#xff0c;是Qwen2-VL的续作&#xff0c;截止2024年11月&#xff0c;引用数24 文章目录 1 论文摘要2 引言3 实验3.…

StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 目录 1.前言 2.线程池基础知识回顾 2.1.线程池的组成 2.2.工作流程 2…

前端埋点与监控最佳实践:从基础到全流程实现.

前端埋点与监控最佳实践&#xff1a;从基础到全流程实现 大纲 我们会从以下三个方向来讲解埋点与监控的知识&#xff1a; 什么是埋点&#xff1f;什么是监控&#xff1f; JS 中实现监控的核心方案 写一个“相对”完整的监控实例 一、什么是埋点&#xff1f;什么是监控&am…

rom定制系列------红米k30_4G版澎湃os安卓13批量线刷固件

&#x1f49d;&#x1f49d;&#x1f49d;红米k30 4G版&#xff0c;机型代码;phoenix.此机型官方固件最后一版为稳定版13.0.6安卓12的固件。客户的软件需运行在至少安卓13的系统至少。测试原生适配有bug。最终测试在第三方澎湃os安卓13的固件可以完美运行。 &#x1f49d;&am…

钉钉平台开发小程序

一、下载小程序开发者工具 官网地址&#xff1a;小程序开发工具 - 钉钉开放平台 客户端类型 下载链接 MacOS x64 https://ur.alipay.com/volans-demo_MiniProgramStudio-x64.dmg MacOS arm64 https://ur.alipay.com/volans-demo_MiniProgramStudio-arm64.dmg Windows ht…

android——渐变色

1、xml的方式实现渐变色 效果图&#xff1a; xml的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…

微信小程序生成二维码

目前是在开发小程序端 --> 微信小程序。然后接到需求&#xff1a;根据 form 表单填写内容生成二维码&#xff08;第一版&#xff1a;表单目前需要客户进行自己输入&#xff0c;然后点击生成按钮实时生成二维码&#xff0c;不需要向后端请求&#xff0c;不存如数据库&#xf…

rhce:web服务器

web服务器简介 服务器端&#xff1a;此处使用 nginx 提供 web 服务&#xff0c; RPM 包获取&#xff1a; http://nginx.org/packages/ /etc/nginx/ ├── conf.d #子配置文件目录 ├── default.d ├── fastcgi.conf ├── fastcgi.conf.default ├── fastcgi_params #用…

解决使用netstat查看端口显示FIN_WAIT的问题

解决使用netstat查看端口显示FIN_WAIT的问题 1. 理解`FIN_WAIT`状态2. 检查应用程序3. 检查网络延迟和稳定性4. 更新和修补系统5. 调整TCP参数6. 使用更详细的工具进行分析7. 咨询开发者或技术支持8. 定期监控和评估结论在使用 netstat查看网络连接状态时,如果发现大量连接处…

01LangChain 实战课开篇——AI奇点时刻

LangChain 实战课开篇——AI奇点时刻 课程简介 课程背景&#xff1a;随着ChatGPT和GPT-4的出现&#xff0c;AI技术与实际应用之间的距离变得前所未有的近。LangChain作为基于大模型的应用开发框架&#xff0c;为程序员提供了开发智能应用的新工具。 LangChain 概述 定义&am…

【java】java的基本程序设计结构06-运算符

运算符 一、分类 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 1.1 算术运算符 操作符描述例子加法 - 相加运算符两侧的值A B 等于 30-减法 - 左操作数减去右操作数A – B 等于 -10*乘法 - 相乘操作符两侧的值A * B等于200/除法 - 左操作数除以右操作数B /…

Spring Cloud Sleuth(Micrometer Tracing +Zipkin)

分布式链路追踪 分布式链路追踪技术要解决的问题&#xff0c;分布式链路追踪&#xff08;Distributed Tracing&#xff09;&#xff0c;就是将一次分布式请求还原成调用链路&#xff0c;进行日志记录&#xff0c;性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节…

关于我的编程语言——C/C++——第四篇(深入1)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09; 字符类型介绍 char…

一台手机可以登录运营多少个TikTok账号?

很多TikTok内容创作者和商家通过运营多个账号来实现品牌曝光和产品销售&#xff0c;这种矩阵运营方式需要一定的技巧和设备成本&#xff0c;那么对于很多新手来说&#xff0c;一台手机可以登录和运营多少个TikTok账号呢&#xff1f; 一、运营TikTok账号的数量限制 TikTok的官…

DNS服务器部署

一、要求 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 二、配置 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 &#xff08;1&#xff09;首先需要安装bind服务 &#xf…

三周精通FastAPI:28 构建更大的应用 - 多个文件

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/bigger-applications 更大的应用 - 多个文件 如果你正在开发一个应用程序或 Web API&#xff0c;很少会将所有的内容都放在一个文件中。 FastAPI 提供了一个方便的工具&#xff0c;可以在保持所有灵活性的同时…