STL模板:容器与算法
1. STL 介绍
1.1 什么是 STL?
- STL (Standard Template Library):C++ 标准库的一部分,提供高效、可重用的数据结构和算法。
- 主要组成部分:
- 容器 (Containers):存储数据的结构。
- 算法 (Algorithms):对容器中的数据进行操作的函数。
- 迭代器 (Iterators):访问容器元素的对象。
- 函数对象 (Function Objects):可作为参数传递的对象。
2. STL 容器
2.1 序列容器 (Sequence Containers)
vector
:动态数组,支持快速随机访问。deque
:双端队列,支持从两端插入和删除元素。list
:双向链表,支持高效的插入和删除操作。array
:固定大小数组,支持快速访问。
示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6); // 添加元素
for (int val : vec) {
std::cout << val << " "; // 输出 1 2 3 4 5 6
}
return 0;
}
2.2 关联容器 (Associative Containers)
set
:集合,存储唯一元素并自动排序。map
:映射,存储键值对并自动根据键排序。unordered_set
:无序集合,基于哈希表实现,查找效率高。unordered_map
:无序映射,基于哈希表实现,查找效率高。
示例:
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3, 4};
s.insert(5); // 插入元素
for (int val : s) {
std::cout << val << " "; // 输出 1 2 3 4 5
}
return 0;
}
2.3 容器适配器 (Container Adapters)
stack
:栈,基于 deque
实现。queue
:队列,基于 deque
实现。priority_queue
:优先队列,基于堆实现。
示例:
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
s.push(1);
s.push(2);
while (!s.empty()) {
std::cout << s.top() << " "; // 输出 2 1
s.pop();
}
return 0;
}
3. STL 迭代器
3.1 迭代器概述
- 迭代器是用于访问容器中元素的对象,类似于指针。
- 常见操作:
begin()
和 end()
:获取容器的开始和结束位置。++
:迭代器的递增。*
:解引用,获取迭代器指向的元素。
示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " "; // 输出 1 2 3 4 5
}
return 0;
}
3.2 范围基 for
循环
- C++11 引入了范围基
for
循环,使得遍历容器更加简洁。
示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int val : vec) {
std::cout << val << " "; // 输出 1 2 3 4 5
}
return 0;
}
4. STL 算法
4.1 常用算法
sort()
:排序容器中的元素。find()
:查找容器中的元素。reverse()
:反转容器中的元素。accumulate()
:计算容器中所有元素的和。
示例:
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::sort(vec.begin(), vec.end(), std::greater<int>());
for (int val : vec) {
std::cout << val << " "; // 输出 5 4 3 2 1
}
int sum = std::accumulate(vec.begin(), vec.end(), 0);
std::cout << "\nSum: " << sum; // 输出 Sum: 15
return 0;
}
4.2 容器与算法结合
- STL 的算法可以与容器配合使用,简化代码,提升开发效率。
示例:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2};
auto it = std::find(vec.begin(), vec.end(), 4);
if (it != vec.end()) {
std::cout << "Found: " << *it << std::endl; // 输出 Found: 4
}
vec.erase(std::remove(vec.begin(), vec.end(), 1), vec.end());
for (int val : vec) {
std::cout << val << " "; // 输出 3 4 5 9 2
}
return 0;
}
5. 总结
- STL 提供了强大的容器、算法和迭代器功能,简化了代码并提高了开发效率。
- 理解 STL 容器和算法的使用方式是成为 C++ 高效开发者的关键。
- 学习模板编程的基础,有助于理解 STL 的泛型编程。
6. 练习与作业
6.1 练习
- 使用
vector
容器存储 10 个随机整数,排序并输出。 - 使用
map
容器统计一个字符串中各个字符的频率。 - 实现一个简单的函数,接受一个
stack
容器并返回其栈顶元素。
6.2 作业
- 用
set
容器实现一个简易的集合操作,支持添加、删除和查找元素。 - 编写一个程序,使用
priority_queue
实现一个优先级队列。 - 使用
accumulate
计算并输出一个 vector
中所有元素的平均值。