一.总体介绍
STL(Standard Template Library)是C++标准模板库,提供了一系列的通用模板类和函数,用于实现常见的数据结构和算法,方便开发者快速地实现各种功能。STL包括了容器(Containers)、算法(Algorithms)和迭代器(Iterators)三个组件。
STL容器是STL中最重要的部分之一,提供了各种不同类型的数据结构,包括序列容器(如vector、list、deque等)、关联容器(如set、map、multiset、multimap等)和容器适配器(如stack、queue、priority_queue等)。每种容器都有不同的特点和适用场景,开发者可以根据具体需求选择合适的容器。
以下是STL中常用的容器及其简要介绍:
- vector:动态数组,支持随机访问和动态增删元素,适用于需要频繁访问元素的情况。
- list:双向链表,支持快速插入和删除元素,适用于频繁插入和删除元素的情况。
- deque:双端队列,支持在两端进行插入和删除操作,适用于需要在两端进行频繁插入和删除操作的情况。
- set/multiset:集合,元素按照一定规则排序,且元素不重复,适用于需要快速查找和去重的情况。
- map/multimap:映射,键值对存储,适用于需要快速查找和键值对存储的情况。
- stack:栈,后进先出的数据结构,适用于需要后进先出的情况。
- queue:队列,先进先出的数据结构,适用于需要先进先出的情况。
- priority_queue:优先队列,按照一定规则排序,每次取出的元素为最优先元素,适用于需要按照优先级取出元素的情况。
在选择STL容器时,需要根据具体的需求和情况进行选择,考虑以下因素:
- 数据结构特点:不同的容器有不同的特点和适用场景,需要根据需求选择合适的数据结构。
- 操作复杂度:不同的容器对于不同的操作有不同的时间复杂度,需要根据具体操作的频率选择合适的容器。
- 内存占用:不同的容器在内存占用上也有不同,需要根据内存占用的要求选择合适的容器。
总的来说,STL容器提供了丰富的选择,开发者可以根据具体需求选择合适的容器,以实现高效的数据结构和算法。
二.使用方法
1.vector
#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};for (int i = 0; i < vec.size(); i++) {std::cout << vec[i] << " ";}return 0;
}
2.list
#include <list>
#include <iostream>int main() {std::list<int> myList = {1, 2, 3, 4, 5};myList.push_back(6);myList.push_front(0);for (auto it = myList.begin(); it != myList.end(); it++) {std::cout << *it << " ";}return 0;
}
3.deque
#include <deque>
#include <iostream>int main() {std::deque<int> myDeque = {1, 2, 3, 4, 5};myDeque.push_back(6);myDeque.push_front(0);for (int i = 0; i < myDeque.size(); i++) {std::cout << myDeque[i] << " ";}return 0;
}
4.set
#include <set>
#include <iostream>int main() {std::set<int> mySet = {3, 1, 4, 1, 5, 9};for (auto it = mySet.begin(); it != mySet.end(); it++) {std::cout << *it << " ";}return 0;
}
5.map
#include <map>
#include <iostream>int main() {std::map<std::string, int> myMap = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};for (auto it = myMap.begin(); it != myMap.end(); it++) {std::cout << it->first << ": " << it->second << std::endl;}return 0;
}
6.stack
#include <stack>
#include <iostream>int main() {std::stack<int> myStack;myStack.push(1);myStack.push(2);myStack.push(3);while (!myStack.empty()) {std::cout << myStack.top() << " ";myStack.pop();}return 0;
}
7.queue
#include <queue>
#include <iostream>int main() {std::queue<int> myQueue;myQueue.push(1);myQueue.push(2);myQueue.push(3);while (!myQueue.empty()) {std::cout << myQueue.front() << " ";myQueue.pop();}return 0;
}
三.优先队列介绍
priority_queue
是一个优先队列容器,它基于堆数据结构实现,可以保证在插入和删除元素时,始终保持队列中的元素按照一定的优先级顺序排列。在priority_queue
中,最优先的元素始终位于队列的顶部,可以通过top()
方法获取最优先的元素。
priority_queue
提供了一些常用的操作,如插入元素push()
、删除最优先元素pop()
、获取最优先元素top()
等。在priority_queue
中,元素的优先级由比较函数或者元素类型的<
操作符决定。以下是
priority_queue
的一些重要特点和注意事项:
- 默认情况下,
priority_queue
是一个最大堆,即最大的元素位于队列的顶部。- 可以通过指定比较函数或者使用自定义的元素类型重载
<
操作符来实现最小堆。priority_queue
不支持遍历操作,只能通过top()
方法获取最优先元素,然后通过pop()
方法删除该元素。- 插入和删除操作的时间复杂度为 O(log n),获取最优先元素的时间复杂度为 O(1)。
示例:
#include <queue>
#include <iostream>int main() {std::priority_queue<int> myPriorityQueue;myPriorityQueue.push(3);myPriorityQueue.push(1);myPriorityQueue.push(5);while (!myPriorityQueue.empty()) {std::cout << myPriorityQueue.top() << " ";myPriorityQueue.pop();}return 0;
}
在上面的示例中,我们创建了一个
priority_queue
,并依次插入了元素 3、1、5。然后通过循环获取最优先元素并输出,最终输出结果为 5、3、1。