C++ SLT标准模板简介

STL全称是standard template libaray 标准模板库,这个库是C++库中十分重要的一部分,里面涵盖可复用的组件库,而且是一个包罗了数据结构与算法的软件框架。

STL各主要版本

stl库最初是由Alexander Stepanov、Meng Lee在惠普工作室中完成的原始版本,本着开源精神,他们声明允许任何人任意运用,拷贝,修改,传播甚至商业使用这些代码无需付费,唯一条件就是像原始版本一样也需要开源使用。HP版本是STL库的实现版本的始祖。

windows visual c++:PJ版本由P.J.Plauger开发,继承自HP版本,不能公开或修改,可读性较低,符号命名比较怪异。

c++ Builder:RW版本由rouge wage公司开发继承自HP版本,不能公开或修改可读性一般。

GCC:SGI版本由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版本,可移植性好,可公开,修改甚至贩卖,从命名风格和编程风格上看阅读性很高。

SLT六大组件

仿函数:类中定义的一个operator()括号运算符的重载,使用上类型函数一样

空间适配器:相当于一个内存池,当需要申请空间时可以直接从内存池中获取空间。

算法:一些比较常用的算法都会包含在SLT里面需要时直接调用即可,如sort是快排,在重复度不高的数组中非常好用。

容器:存储数据的方式如string就是模拟C语言中的字符串实现的,其本质是一个类,里面使用一个字符数组存储一个字符串。功能实用性会比单纯的字符串好用。

迭代器:参考C语言中指针使用方法,底层实现大部分也都是指针,但是对指针进行封装,提高指针的安全性。

配接器:也叫容器适配器,是一种数据结构,从上图中可以看到stack,queue分别是栈和队列。

STL就是以上述的组件为原型制作的一系列模板(大部分,还有其他如输入输出库),里面有一些是类模板,结构体模板,函数模板等都是为了在C的基础上更好的使用不用每个功能组件都自己手动写出来能有一个通用的模板大大的提升了编程的效率。

### C++ 中常用的标准模板库 (STL) C++标准模板库(Standard Template Library, STL)是一组高效的通用算法和数据结构集合,广泛应用于各种编程场景。以下是关于 STL 的一些核心功能及其用法: #### 1. 容器 容器是用于存储对象的数据结构。常见的 STL 容器包括 `vector`、`list`、`deque`、`set` 和 `map`。 - **Vector**: 动态数组,支持快速随机访问。可以通过 `.push_back()` 插入元素,`.pop_back()` 删除最后的元素,以及通过 `.clear()` 清空整个容器[^1]。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec; for (int i = 1; i <= 5; ++i) { vec.push_back(i); } vec.pop_back(); vec.clear(); // 清空所有元素 } ``` - **Set/Multiset**: 提供有序集合的功能,不允许重复键值(对于 `multiset` 则可以有重复键值)。其底层实现通常是一个红黑树,因此插入和删除操作的时间复杂度为 \(O(\log n)\)[^2]。 #### 2. 算法 STL 还提供了一系列强大的泛型算法来处理容器中的元素。 - **Reverse**: 可以反转序列中的元素顺序。该函数接受两个迭代器参数,分别指向要反转范围的起点和终点[^3]。 ```cpp #include <algorithm> #include <vector> #include <iostream> int main() { int a[] = {1, 2, 3, 4, 5}; std::reverse(a, a + 5); std::vector<int> v = {1, 2, 3, 4, 5}; std::reverse(v.begin(), v.end()); } ``` - **Unique**: 对于已排序的序列,移除相邻的重复项。注意此函数不会改变原始容器大小,需配合其他方法如 `erase` 使用。 ```cpp #include <algorithm> #include <vector> #include <iostream> int main() { std::vector<int> v = {1, 2, 2, 3, 3, 3, 4}; auto last = std::unique(v.begin(), v.end()); // 移动指针到唯一部分之后的位置 v.erase(last, v.end()); // 实际减少向量长度 } ``` #### 3. 队列与优先队列 除了基本容器外,还有专门设计用来模拟特定行为模式的适配器类,比如栈 (`stack`)、队列 (`queue`) 和优先队列 (`priority_queue`)。 - **Priority Queue**: 默认情况下按照降序排列,默认使用最大堆实现。适合解决涉及动态维护最值的问题。 ```cpp #include <queue> #include <iostream> int main() { std::priority_queue<int> pq; pq.push(10); pq.push(30); while (!pq.empty()) { std::cout << pq.top() << ' '; pq.pop(); } } ``` --- ### 性能特点 每种容器都有自己的优缺点,在选择具体使用的容器时应考虑实际需求。例如当需要频繁插入/删除中间位置的节点时可以选择链表;如果更关注连续内存分配则推荐使用矢量等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值