C++ 标准模板库(STL)参考指南

STL 介绍

C++标准模板库(Standard Template Library,STL)是C++标准库的重要组成部分,提供了一系列模板化的通用数据结构和算法。

STL最初由Alexander Stepanov在20世纪90年代早期开发,后于1994年被纳入C++标准。它的设计理念基于泛型编程,强调代码复用和效率。

STL简单示例
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    // 创建vector容器
    std::vector<int> nums = {5, 2, 8, 1, 9};
    
    // 使用算法排序
    std::sort(nums.begin(), nums.end());
    
    // 使用迭代器遍历
    for (auto it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";
    }
    
    return 0;
}

STL的核心优势

六大部件总览

STL由六个主要组件构成,它们协同工作提供强大的功能:

容器(Containers)

用于存储数据的模板类,如vector、list、map等,分为序列容器和关联容器两大类。

迭代器(Iterators)

提供访问容器元素的方法,类似于指针,是算法与容器之间的桥梁。

算法(Algorithms)

执行各种操作的标准模板函数,如排序、搜索、变换等,通过迭代器操作容器。

仿函数(Functors)

重载了operator()的类对象,可以像函数一样被调用,用于自定义操作行为。

适配器(Adapters)

修改容器或仿函数接口的组件,如stack、queue、priority_queue等。

空间配置器(Allocators)

负责内存分配与管理的模板类,允许自定义内存分配策略。

组件协作关系

STL六大组件通过标准化的接口协同工作:

容器通过空间配置器获取存储空间;算法通过迭代器访问容器内容;仿函数可以协助算法完成不同的策略变化;适配器可以修饰或组合其他组件。

容器(Containers)

容器是存储其他对象的对象,管理对象的集合。STL容器分为序列容器和关联容器两大类。

序列容器

vector

动态数组,支持快速随机访问,尾部插入/删除高效

deque

双端队列,支持头尾高效插入/删除

list

双向链表,任意位置高效插入/删除

forward_list

单向链表,更节省空间

array

固定大小数组,更安全的传统数组替代

关联容器

set

有序唯一键集合,基于红黑树实现

map

有序键值对集合,键唯一

multiset

有序集合,允许重复键

multimap

有序键值对集合,允许重复键

无序关联容器(C++11)

unordered_set

哈希集合,无序但查找高效

unordered_map

哈希映射,键值对的无序集合

unordered_multiset

允许重复键的哈希集合

unordered_multimap

允许重复键的哈希映射

迭代器(Iterators)

迭代器提供了一种访问容器元素的方法,同时隐藏了容器的内部实现细节。它们类似于指针,可以遍历容器中的所有元素。

迭代器类别

输入迭代器

只读访问,单向移动

输出迭代器

只写访问,单向移动

前向迭代器

读写访问,单向移动

双向迭代器

读写访问,双向移动

随机访问迭代器

读写访问,任意位置跳转

迭代器操作

迭代器使用示例
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};
    
    // 获取迭代器
    auto it = vec.begin();
    
    // 迭代器基本操作
    std::cout << "First element: " << *it << std::endl; // 10
    
    it += 2; // 随机访问
    std::cout << "Third element: " << *it << std::endl; // 30
    
    // 使用迭代器遍历
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    
    return 0;
}

算法(Algorithms)

STL提供了超过100种算法,用于执行排序、搜索、变换等操作。这些算法通过迭代器与容器交互,不依赖容器的具体实现。

常用算法分类

分类 算法示例 功能描述
排序算法 sort, stable_sort, partial_sort 对序列进行排序
查找算法 find, binary_search, lower_bound 在序列中查找元素
数值算法 accumulate, inner_product, iota 数值计算操作
修改算法 copy, transform, replace, fill 修改序列内容
分区算法 partition, stable_partition 根据条件分区元素
堆算法 make_heap, push_heap, pop_heap 堆结构操作
集合算法 set_union, set_intersection 集合操作
排列算法 next_permutation, prev_permutation 生成排列

算法示例代码

常用算法演示
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

int main() {
    std::vector<int> vec = {5, 3, 1, 4, 2};
    
    // 排序
    std::sort(vec.begin(), vec.end());
    
    // 查找
    auto it = std::find(vec.begin(), vec.end(), 4);
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    }
    
    // 数值计算
    int sum = std::accumulate(vec.begin(), vec.end(), 0);
    std::cout << "Sum: " << sum << std::endl;
    
    // 变换
    std::vector<int> doubled(vec.size());
    std::transform(vec.begin(), vec.end(), doubled.begin(), 
                   [](int x) { return x * 2; });
    
    // 输出结果
    for (int x : doubled) {
        std::cout << x << " ";
    }
    
    return 0;
}

仿函数(Functors)

前往

适配器(Adapters)

前往

空间配置器(Allocators)

前往

容器使用指南

前往

迭代器使用指南

前往

算法使用指南

前往