欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > (八)C++的标准模板库(STL)

(八)C++的标准模板库(STL)

2025/11/10 19:19:26 来源:https://blog.csdn.net/m0_55389449/article/details/145519407  浏览:    关键词:(八)C++的标准模板库(STL)

标准模板库(Standard Template Library,简称STL) 是C++标准库的核心组成部分,提供了一组通用的模板类和函数,用于处理常见的数据结构和算法。STL的设计目标是提供高效、灵活且可重用的组件,使得程序员能够专注于应用逻辑,而无需从头实现基本的数据结构和算法。以下是对C++ STL的详细介绍,包括其主要组件、常用容器、迭代器、算法以及使用示例。

一.STL的主要组件

STL主要由以下四个组件组成:
a. 容器(Containers)
容器是用于存储和管理数据的模板类。STL提供了多种类型的容器,每种容器都有其特定的使用场景和性能特性。

顺序容器(Sequence Containers):按线性顺序存储元素。
std::vector:动态数组,支持快速随机访问。
std::deque:双端队列,支持快速在两端插入和删除。
std::list:双向链表,支持快速在任意位置插入和删除。
std::forward_list:单向链表,内存占用较低。

关联容器(Associative Containers):基于键值对存储元素,自动排序。
std::set:存储唯一的键,自动排序。
std::map:存储键值对,键唯一,自动排序。
std::multiset:存储可重复的键,自动排序。
std::multimap:存储可重复的键值对,自动排序。

无序关联容器(Unordered Associative Containers):基于哈希表存储元素,不保证顺序。
std::unordered_set:存储唯一的键。
std::unordered_map:存储键值对,键唯一。
std::unordered_multiset:存储可重复的键。
std::unordered_multimap:存储可重复的键值对。

容器适配器(Container Adapters):提供特定接口的容器。
std::stack:后进先出(LIFO)栈。
std::queue:先进先出(FIFO)队列。
std::priority_queue:优先队列,根据优先级排序。

b. 迭代器(Iterators)
迭代器是用于遍历容器中元素的抽象概念,类似于指针。STL中的算法通常通过迭代器来操作容器中的元素。
分类:
输入迭代器(Input Iterator):只读,单向。
输出迭代器(Output Iterator):只写,单向。
前向迭代器(Forward Iterator):可读写,单向。
双向迭代器(Bidirectional Iterator):可读写,双向。
随机访问迭代器(Random Access Iterator):可读写,支持随机访问。

c. 算法(Algorithms)
STL提供了大量通用的算法,这些算法可以应用于不同的容器。常见的算法包括:
排序和搜索:
std::sort:对元素进行排序。
std::binary_search:在已排序的范围内进行二分搜索。
std::find:查找元素。
std::find_if:根据条件查找元素。
遍历和修改:
std::for_each:对范围内的每个元素执行指定操作。
std::transform:对范围内的每个元素应用函数,并存储结果。
std::copy:复制元素。
std::replace:替换元素。
集合操作:
std::set_union:计算两个集合的并集。
std::set_intersection:计算两个集合的交集。
std::set_difference:计算两个集合的差集。
d. 函数对象(Functors)
函数对象是可以像函数一样调用的对象,通常通过重载()运算符实现。STL中的许多算法允许传入函数对象,以实现自定义的行为。

二.常用容器

a. std::vector
特点:动态数组,支持快速随机访问,内存连续。
使用场景:需要快速访问元素,且元素数量变化频繁。

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};vec.push_back(6); // 添加元素for(auto& elem : vec) {std::cout << elem << " ";}std::cout << std::endl; // 输出: 1 2 3 4 5 6return 0;
}

b. std::list
特点:双向链表,支持快速在任意位置插入和删除,不支持随机访问。
使用场景:需要频繁插入和删除元素,且不关心元素的顺序。
示例:

#include <list>
#include <iostream>int main() {std::list<std::string> lst = {"apple", "banana", "cherry"};lst.push_front("date"); // 在前端添加元素lst.push_back("elderberry"); // 在后端添加元素for(auto& elem : lst) {std::cout << elem << " ";}std::cout << std::endl; // 输出: date apple banana cherry elderberryreturn 0;
}

c. std::map
特点:关联容器,存储键值对,键唯一,自动排序。
使用场景:需要根据键快速查找值。
示例:

#include <map>
#include <string>
#include <iostream>int main() {std::map<std::string, int> ageMap;ageMap["Alice"] = 30;ageMap["Bob"] = 25;ageMap["Charlie"] = 28;std::cout << "Alice is " << ageMap["Alice"] << " years old." << std::endl; // 输出: Alice is 30 years old.return 0;
}

三.迭代器
迭代器是STL中用于遍历容器中元素的工具。不同的容器提供不同类型的迭代器。

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {10, 20, 30, 40, 50};for(auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl; // 输出: 10 20 30 40 50return 0;
}

四.算法

STL提供了许多通用的算法,可以应用于不同的容器。

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {5, 3, 1, 4, 2};std::sort(vec.begin(), vec.end()); // 排序for(auto& elem : vec) {std::cout << elem << " "; // 输出: 1 2 3 4 5}std::cout << std::endl;return 0;
}

五.函数对象

函数对象可以通过重载()运算符实现自定义的行为,常用于STL算法中。

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用函数对象进行平方操作std::transform(vec.begin(), vec.end(), vec.begin(), [](int x) { return x * x; });for(auto& elem : vec) {std::cout << elem << " "; // 输出: 1 4 9 16 25}std::cout << std::endl;return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com