STL(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一组通用的模板类和函数,用于进行常见的数据结构和算法操作。STL采用泛型编程的方式,可以以通用的方式操作不同类型的数据。
目录
容器(Containers)
概念:
- 用于存储和管理数据的类模板,如vector、list、deque、set、map等。
- 容器提供不同的数据结构和访问方式,可以根据需求选择最适合的容器。
顺序容器
vector(顺序表):动态数组,支持快速随机访问,可动态调整大小。
list(链表):双向链表,支持快速插入和删除操作,但无法进行随机访问。
deque(双端队列):双端队列,支持在两端进行快速插入和删除操作
适配器(Adapters)
概念:适配器是一种组件,用于将已有的容器或算法接口转换为另一种接口形式,以满足不同的需要或使用习惯。适配器旨在提供一种转换机制,使得不同的组件能够互操作或适应特定的场景。
statck:基于deque或list实现的栈数据结构适配器,提供后入先出(LIFO)的存储和访问方式。
queue:基于deque或list实现的队列数据结构适配器,提供先入先出(FIFO)的存储和访问方式。
priority_queue:基于vector或deque实现的优先队列适配器,按照优先级进行排序和访问。
关联容器
概念:关联容器(Associative Containers)是一种特殊的容器,它们基于键值对(key-value)的概念来存储和组织数据。关联容器提供了高效的查找和插入操作,以支持快速访问和操作数据。
map:映射容器,存储键值对(key-value),按照键进行排序。键唯一,当插入相同的键时会覆盖原来的值。可以快速根据键进行查找、插入和删除操作。
set //tree:集合容器,只存储唯一的键(key),且按照特定的比较准则进行排序。可以快速进行插入、查找和删除操作。
multimap:多重集合容器,存储不唯一的键(key),且按照特定的比较准则进行排序。可以快速进行插入、查找和删除操作。
multiset:
- 是一个有序容器,可存储不唯一的元素。
- 多重集合容器中的元素按照一定的排序准则进行排序,通常是按照元素的值进行排序。
- 具有快速的插入、查找和删除操作。
- 插入操作不会覆盖重复的元素,允许存储多个相同的元素。
#include <iostream>
#include <set>
int main() {
std::multiset<int> numbers;
numbers.insert(5);
numbers.insert(2);
numbers.insert(7);
numbers.insert(3);
numbers.insert(3); // 允许存储多个相同的元素
numbers.insert(1);
// 遍历输出多重集合容器中的元素
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
迭代器(Iterator)
迭代器是一种用于遍历容器元素的对象,它提供了统一的访问接口,使得算法能够操作不同类型的容器。通过使用迭代器,可以便捷地遍历和访问容器中的元素,而不需要关心容器的具体实现细节。
遍历容器元素:使用迭代器可以逐个访问容器中的元素,实现对容器元素的遍历。
访问元素值:迭代器提供了获取和修改元素值的接口,可以对容器中的元素进行读取和写入操作。
算法操作:很多算法要求提供迭代器作为参数,以便在容器上进行操作。通过传递合适的迭代器,可以使算法在不同类型的容器上工作。
容器范围定义:迭代器可以定义容器的起始位置和结束位置,用于指定所需操作的元素范围
迭代器常见操作
取决于迭代器的类型):
解引用(Dereference):使用*操作符访问迭代器指向的元素值。
前进(Increment):使用++运算符将迭代器向前移动到下一个元素。
后退(Decrement):使用--运算符将迭代器向后移动到前一个元素。
比较(Comparison):使用比较运算符(如==、!=、<、>等)比较两个迭代器的位置关系。
常见的迭代器
输入迭代器(Input Iterator):只能进行读取操作,不支持写入操作。
输出迭代器(Output Iterator):只能进行写入操作,不支持读取操作。
前向迭代器(Forward Iterator):支持读取和写入操作,并可以逐个向前移动迭代器。
双向迭代器(Bidirectional Iterator):类似于前向迭代器,但还可以逐个向后移动迭代器。
随机访问迭代器(Random Access Iterator):提供了前向和后向移动迭代器的能力,还支持常数时间的随机访问。
算法
sort(b,e)
sort(b,e,回掉函数)
unique(b,e); //使用该算法前,要先对元素进行排序
find_if(b,e,谓词);
count_if(b,e,谓词);
for_each(b,e,回掉函数);