STL(标准模板库)是C++中使用广泛的模板库,它提供了许多常用的数据结构和算法。下面将详细介绍STL中的所有数据类型,并给出一些使用示例。
-
容器(Containers):
- vector:可变大小的动态数组,类似于内置数组,但可以自动调整大小。
#include <vector> using namespace std; vector<int> nums {1, 2, 3, 4, 5}; nums.push_back(6); // 添加元素到末尾 nums.pop_back(); // 删除末尾元素
- list:双向链表,支持高效的插入和删除操作。
#include <list> using namespace std; list<int> nums {1, 2, 3, 4, 5}; nums.push_front(0); // 在链表头部插入元素 nums.pop_front(); // 删除链表头部元素
- deque:双端队列,类似于向量,但可以在头部和尾部进行插入和删除操作。
#include <deque> using namespace std; deque<int> nums {1, 2, 3, 4, 5}; nums.push_front(0); // 在头部插入元素 nums.pop_front(); // 删除头部元素 nums.push_back(6); // 在尾部插入元素 nums.pop_back(); // 删除尾部元素
- stack:栈,后入先出(LIFO)的数据结构。
#include <stack> using namespace std; stack<int> nums; nums.push(1); // 入栈 nums.push(2); nums.pop(); // 出栈
- queue:队列,先入先出(FIFO)的数据结构。
#include <queue> using namespace std; queue<int> nums; nums.push(1); // 入队列 nums.push(2); nums.pop(); // 出队列
- priority_queue:优先队列,根据元素的优先级进行排序,每次取出优先级最高的元素。
#include <queue> using namespace std; priority_queue<int> nums; nums.push(3); // 插入元素 nums.push(1); nums.push(2); int highest = nums.top(); // 获取优先级最高的元素 nums.pop(); // 删除优先级最高的元素
- set:有序集合,存储不重复的元素,支持插入、删除和查找操作。
#include <set> using namespace std; set<int> nums {1, 2, 3, 4, 5}; nums.insert(6); // 插入元素 nums.erase(3); // 删除元素 auto it = nums.find(2); // 查找元素
- multiset:有序多重集合,存储可重复的元素,支持插入、删除和查找操作。
#include <set> using namespace std; multiset<int> nums {1, 2, 3, 4, 5}; nums.insert(2); nums.erase(3); auto range = nums.equal_range(2); // 查找元素的范围
- map:有序键值对,存储唯一的键和对应的值,支持按键进行插入、删除和查找操作。
#include <map> using namespace std; map<string, int> temperature {{"Monday", 25}, {"Tuesday", 27}, {"Wednesday", 24}}; temperature["Thursday"] = 26; // 插入键值对 temperature.erase("Wednesday"); // 删除键值对 auto it = temperature.find("Tuesday"); // 查找键对应的值
- multimap:有序多重键值对,存储可重复的键和对应的值,支持按键进行插入、删除和查找操作。
#include <map> using namespace std; multimap<char, int> grades {{'A', 90}, {'B', 80}, {'C', 70}}; grades.insert(make_pair('B', 75)); // 插入键值对 grades.erase('C'); // 删除键对应的所有值 auto range = grades.equal_range('B'); // 查找键对应的值的范围
- unordered_set:无序集合,存储不重复的元素,支持插入、删除和查找操作,内部实现为哈希表。
#include <unordered_set> using namespace std; unordered_set<int> nums {1, 2, 3, 4, 5}; nums.insert(6); // 插入元素 nums.erase(3); // 删除元素 auto it = nums.find(2); // 查找元素
- unordered_multiset:无序多重集合,存储可重复的元素,支持插入、删除和查找操作,内部实现为哈希表。
#include <unordered_set> using namespace std; unordered_multiset<int> nums {1, 2, 3, 4, 5}; nums.insert(2); nums.erase(3); auto range = nums.equal_range(2); // 查找元素的范围
- unordered_map:无序键值对,存储唯一的键和对应的值,支持按键进行插入、删除和查找操作,内部实现为哈希表。
#include <unordered_map> using namespace std; unordered_map<string, int> temperature {{"Monday", 25}, {"Tuesday", 27}, {"Wednesday", 24}}; temperature["Thursday"] = 26; // 插入键值对 temperature.erase("Wednesday"); // 删除键值对 auto it = temperature.find("Tuesday"); // 查找键对应的值
- unordered_multimap:无序多重键值对,存储可重复的键和对应的值,支持按键进行插入、删除和查找操作,内部实现为哈希表。
#include <unordered_map> using namespace std; unordered_multimap<char, int> grades {{'A', 90}, {'B', 80}, {'C', 70}}; grades.insert(make_pair('B', 75)); // 插入键值对 grades.erase('C'); // 删除键对应的所有值 auto range = grades.equal_range('B'); // 查找键对应的值的范围
-
迭代器(Iterators):
- 迭代器是STL中通用的遍历和访问容器元素的手段,允许以相同的方式访问不同容器类型。
- begin():返回指向容器中第一个元素的迭代器。
- end():返回指向容器中最后一个元素之后位置的迭代器。
- advance():将迭代器移动指定的距离。
- distance():计算两个迭代器之间的距离。
- next():返回指向当前迭代器位置之后指定距离的迭代器。
- prev():返回指向当前迭代器位置之前指定距离的迭代器。
#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { vector<int> nums {1, 2, 3, 4, 5}; // 使用迭代器遍历向量中的元素 vector<int>::iterator it; for (it = nums.begin(); it != nums.end(); ++it) { cout << *it << " "; } cout << endl; // 使用反向迭代器逆序遍历向量中的元素 vector<int>::reverse_iterator rit; for (rit = nums.rbegin(); rit != nums.rend(); ++rit)