欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > C++标准模板库STL

C++标准模板库STL

2025/6/17 11:59:09 来源:https://blog.csdn.net/qq_42217078/article/details/148588928  浏览:    关键词:C++标准模板库STL

STL(Standard Template Library) 是 C++ 的核心组成部分之一,它提供了一套强大的容器、算法、迭代器、仿函数和空间配置器,极大地提高了开发效率和代码复用性。下面我将从基本概念、常用容器、算法、迭代器、函数对象等方面,详细讲解 STL 的相关内容

 一、STL 概述

1.什么是 STL?

  • STL 是 C++ 标准库的一部分,由 Bjarne Stroustrup 等人设计。
  • 提供了通用的数据结构和算法,支持泛型编程(Generic Programming)。

2. STL 的五大组件:

  1. 容器(Containers)
  2. 算法(Algorithms)
  3. 迭代器(Iterators)
  4. 仿函数(Function Objects)
  5. 空间配置器(Allocators)(一般不直接使用)

二、常用 STL 容器

容器类型特点示例
vector序列容器动态数组,随机访问快vector<int> v;
list序列容器双向链表,插入删除快list<string> l;
deque序列容器双端队列,两端插入删除快deque<char> d;
array序列容器固定大小数组,性能好array<int, 5> a;
forward_list序列容器单向链表forward_list<int> fl;
map关联容器键值对,按 key 排序map<string, int> m;
unordered_map关联容器哈希表,按 hash 排序unordered_map<string, int> um;
set关联容器唯一元素,按 key 排序set<int> s;
unordered_set关联容器哈希表,唯一元素unordered_set<string> us;
priority_queue容器适配器优先队列,最大/最小堆priority_queue<int> pq;

 三、常用 STL 算法(<algorithm>

算法功能示例
sort()排序sort(v.begin(), v.end());
find()查找元素auto it = find(v.begin(), v.end(), 42);
count()统计元素出现次数int cnt = count(v.begin(), v.end(), 42);
copy()复制元素copy(v1.begin(), v1.end(), back_inserter(v2));
transform()转换元素transform(v.begin(), v.end(), v.begin(), [](int x){ return x*2; });
reverse()反转序列reverse(v.begin(), v.end());
max_element() / min_element()找最大/最小值auto it = max_element(v.begin(), v.end());
accumulate()累加int sum = accumulate(v.begin(), v.end(), 0);
remove() / erase()删除元素v.erase(remove(v.begin(), v.end(), 42), v.end());

 四、迭代器(Iterators)

1. 作用:

  • 用于遍历容器中的元素。
  • 是一种“指针”的抽象,可以像指针一样操作。

2.常见迭代器类型:

类型说明
begin() / end()返回容器的起始和结束迭代器
rbegin() / rend()反向迭代器
const_iterator只读迭代器
iterator可读可写迭代器

 示例:

vector<int> v = {1, 2, 3, 4, 5};for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}

五、函数对象(Functor)

1.什么是函数对象?

  • 是一个重载了 operator() 的类对象。
  • 可以像函数一样被调用,且可以携带状态。

2. 示例:

struct Add {int operator()(int a, int b) {return a + b;}
};Add add;
cout << add(2, 3);  // 输出 5

3. 常见 STL 函数对象:

  • plus<>minus<>multiplies<>:数学运算
  • equal_to<>less<>:比较运算
  • bindfunction:绑定函数参数、封装函数对象

六、STL 容器的底层实现(简要)

容器实现方式时间复杂度
vector动态数组插入/删除尾部 O(1),中间 O(n)
list双向链表插入/删除 O(1)
map红黑树插入/查找 O(log n)
unordered_map哈希表平均 O(1)
set红黑树插入/查找 O(log n)
unordered_set哈希表平均 O(1)

七、STL 的优缺点

1.优点:

  • 高效、灵活、可复用。
  • 支持泛型编程,代码简洁。
  • 丰富的容器和算法,减少重复劳动。

2. 缺点:

  • 学习曲线较陡,需要理解迭代器、算法、模板等。
  • 容器之间有性能差异,需合理选择。

 八、常见问题与注意事项

1. 容器的迭代器失效问题

  • 如 vector 在插入/删除元素后,所有迭代器可能失效
  • mapset 在插入/删除后,只有指向被删元素的迭代器失效

2. 算法与容器的配合

  • 算法通常接受迭代器范围(begin() 到 end())。
  • 不同容器支持的算法可能不同(如 list 不支持 random_access_iterator)。

3. 性能优化建议

  • 使用 reserve() 避免 vector 频繁扩容。
  • 使用 emplace_back() 替代 push_back()
  • 使用 unordered_map 代替 map 如果不需要排序。

九、STL 的常用头文件

头文件说明
<vector>vector 容器
<list>list 容器
<deque>deque 容器
<map>map 和 multimap
<set>set 和 multiset
<algorithm>常用算法
<iterator>迭代器相关
<functional>函数对象、绑定等
<memory>智能指针(unique_ptrshared_ptr

 十、STL 与 C++11/14/17/20 新特性

  • lambda 表达式:方便定义匿名函数对象。
  • auto 类型推导:简化迭代器声明。
  • range-based for 循环:更简洁地遍历容器。
  • std::move 和 std::forward:支持移动语义和完美转发。
  • std::optionalstd::variant:增强类型安全性。

总结:STL 核心要点

类别内容
容器vectormapsetlistunordered_map 等
算法sortfindtransformaccumulate 等
迭代器begin()end()rbegin()rend() 等
函数对象pluslessbindfunction 等
优势高效、灵活、可复用
注意事项迭代器失效、容器性能、算法兼容性

整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!

版权声明:

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

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

热搜词