STL 基础

STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的。

容器和算法通过迭代器进行无缝相连。

1、容器种类:

    1)向量(vector)

可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项的插入和删除就有的时间复杂度与到末尾的距离成正比,尤其对向量头的添加和删除的代价是惊人的高的

    2)表(list)

对任意元素的访问与对两端的距离成正比,但对某个位置上插入和删除一个项的花费为常数时间。

    3)双端队列(deque)

基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作也具有常量时间复杂度

    4)队列(queue)

插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。

    5)堆栈(stack)

堆栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则

    6)集合(set)

由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,具有快速查找的功能。但是它是以牺牲插入车删除操作的效率为代价的

    7)多重集合(multiset)

和集合基本相同,但可以支持重复元素具有快速查找能力

    8)映射(map)

由{键,值}对组成的集合,以某种作用于键对上的谓词排列。具有快速查找能力

    9)多重映射(multi)

比起映射,一个键可以对应多了值。具有快速查找能力

2、迭代器种类:

     1)input iterators(输入迭代器):只能向前移动,每次只能移动一步,只能读他们指向的东西,而且只能读一次。他们以一个输入文件中的read pointer(读指针)为原型;

     2)output iterators(输出迭代器):与上类此,只不过用于输出,他们只能向前移动,每次只能移动一步,只能写他们指向的东西,而且只能写一次。它们以一个输出文件中的write pointer(写指针)为原型;

    3)forward iterators(前向迭代器):这种迭代器能做输入和输出迭代器可以做的每一件事,再加上他们可以读或写他们指向的东西一次以上。这就使得他们可用于multi-pass运算。

    4)bidirectional iterators(双向迭代器)为前向迭代器加上了向后移动的能力。STL的list的iterators属于这一类。set,multise,map和multimap的迭代器也一样。

    5)random access iterators(随机访问迭代器):这种迭代器为双向迭代器加上迭代器运算能力,也就是说在常量时间里向前或向后跳转一个人意的距离。vector,deque和string的迭代器属于这种。

### STL(标准模板库)基础知识介绍 #### 什么是STL STL (Standard Template Library - 标准模板库),是C++标准库的关键部分,不仅提供了大量可复用的组件,还构建了一个包含多种数据结构和算法的软件框架[^1]。 #### 主要组成部分 STL主要由四个核心概念组成: - **容器(Container)** 容器用于存储不同类型的对象集合。常见的容器包括`vector`, `list`, `deque`, `set`, `map`等。每种容器都有各自的特点和适用场景。例如,`list`是一种双向链表,在任意位置插入或删除元素的时间复杂度为O(1)[^5]。 - **迭代器(Iterator)** 迭代器用来遍历容器中的元素。它们类似于指针,可以指向容器内的某个特定位置,并允许顺序访问相邻的数据项。通过迭代器操作,程序员能够以统一的方式处理各种不同的容器类型。 - **算法(Algorithm)** 提供了一系列通用的操作函数,如排序(`sort`)、查找(`find`)、复制(`copy`)等。这些算法被设计成独立于具体容器实现的形式,因此具有高度灵活性和广泛的适应性。对于自定义数据结构也可以轻松应用相应的算法逻辑[^4]。 - **仿函数(Function Object 或 Functor)** 类似于普通函数的对象实例化形式,通常用于定制某些行为模式下的比较规则或是其他运算方式。比如在使用`std::sort()`时可以通过传递一个仿函数来自定义排序依据。 ```cpp // 自定义仿函数示例 struct CompareById { bool operator()(const TDeviceInfo& lhs, const TDeviceInfo& rhs) { return strcmp(lhs.achDeviceId, rhs.achDeviceId) < 0; } }; ``` #### 使用优势 采用STL带来的益处显而易见: - 减少重复造轮子的工作量; - 利用了经过严格验证的标准库代码,提高了系统的稳定性和安全性; - 可以依赖专家级开发者优化后的高效能实现方案; - 推动了良好编码习惯的发展,促进了团队协作交流[^3]。 #### 实际应用场景举例 当涉及到UI界面展示有序列表的情况时,往往需要先对后台维护的数据集按照一定条件完成预处理工作——即排序过程。此时就可以借助STL所提供的强大工具箱来简化任务难度并提升性能表现。假设有一个保存着多个设备基本信息记录的数组,则可以直接调用内置方法对其进行快速排列组合。 ```cpp #include <algorithm> #include <string.h> bool compareByName(const TDeviceInfo &a, const TDeviceInfo &b){ return strcmp(a.achDeviceName,b.achDeviceName)<0; } int main(){ std::vector<TDeviceInfo> devices = /*...*/; // 对devices按名字升序排序 std::sort(devices.begin(), devices.end(), compareByName); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值