目录
C++ 标准模板库(Standard Template Library,简称 STL)是一组组件化的、可复用的、高效的 C++ 类库,用于处理常见的数据结构和算法问题。STL 包括容器、迭代器、算法和函数对象四个主要组件。下面将详细介绍这些组件及其使用方法。
1. 容器(Containers)
容器是用于存储元素的数据结构。STL 中的容器包括顺序容器、关联容器和容器适配器。
顺序容器
std::vector:动态数组,元素连续存储,支持快速随机访问。std::list:双向链表,插入和删除元素快,但随机访问慢。std::deque:双端队列,两端都可以快速插入和删除元素。std::forward_list:单向链表,适合快速插入和删除,但不支持随机访问。
示例:使用 std::vector
cpp
深色版本
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 访问元素
std::cout << "Element at index 2: " << vec.at(2) << std::endl;
// 添加元素
vec.push_back(6);
// 删除元素
vec.erase(vec.begin() + 1);
// 遍历容器
for (int elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
关联容器
std::set:存储唯一元素的排序容器。std::multiset:存储可能重复元素的排序容器。std::map:键值对容器,键必须唯一,值可以相同。std::multimap:键值对容器,键可以重复。
示例:使用 std::map
cpp
深色版本
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> ageMap = {{"Alice", 25}, {"Bob", 30}};
// 插入元素
ageMap.insert({"Charlie", 35});
// 访问元素
auto it = ageMap.find("Bob");
if (it != ageMap.end()) {
std::cout << "Age of Bob: " << it->second << std::endl;
}
// 遍历容器
for (const auto& pair : ageMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
容器适配器
std::stack:后进先出(LIFO)的容器适配器。std::queue:先进先出(FIFO)的容器适配器。std::priority_queue:优先队列,按照优先级顺序取出元素。
示例:使用 std::queue
cpp
深色版本
#include <iostream>
#include <queue>
int main() {
std::queue<int> q;
// 入队
q.push(1);
q.push(2);
q.push(3);
// 出队
while (!q.empty()) {
std::cout << q.front() << " ";
q.pop();
}
std::cout << std::endl;
return 0;
}
2. 迭代器(Iterators)
迭代器用于遍历容器中的元素。每个容器都有自己的迭代器类型,提供了对容器元素的访问。
示例:使用迭代器遍历 std::vector
cpp
深色版本
#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 << " ";
}
std::cout << std::endl;
return 0;
}
3. 算法(Algorithms)
算法是对容器中的元素进行操作的函数模板。常用的算法包括查找、排序、复制等。
示例:使用算法 std::sort
cpp
深色版本
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
// 排序
std::sort(vec.begin(), vec.end());
// 遍历输出
for (int elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
示例:使用算法 std::find
cpp
深色版本
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 查找元素
auto it = std::find(vec.begin(), vec.end(), 3);
if (it != vec.end()) {
std::cout << "Found element: " << *it << std::endl;
}
return 0;
}
4. 函数对象(Function Objects)
函数对象(也称为仿函数)是可以像函数一样调用的对象。它们可以作为算法的参数传递,用于自定义比较逻辑等。
示例:使用函数对象进行排序
cpp
深色版本
#include <iostream>
#include <vector>
#include <algorithm>
struct Compare {
bool operator()(int a, int b) {
return a > b;
}
};
int main() {
std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
// 使用函数对象排序
std::sort(vec.begin(), vec.end(), Compare());
// 遍历输出
for (int elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
总结
STL 是 C++ 中一个极其强大的工具集,它提供了一系列通用的数据结构和算法,极大地提高了 C++ 开发者的生产力。通过上述示例,你可以看到如何使用 STL 中的容器、迭代器、算法和函数对象来处理常见的编程任务。掌握 STL 的使用方法,可以使你的代码更加简洁、高效和易于维护。
在实际开发中,可以根据具体需求选择合适的容器和算法,充分利用 STL 的优势。同时,也可以结合第三方库来扩展 STL 的功能,以满足更复杂的需求。
3712

被折叠的 条评论
为什么被折叠?



