当前位置: 首页 > news >正文

捷 C++ 课程学习笔记:STL 应用与复杂度分析

一、STL 六大组件

STL(Standard Template Library)是 C++ 标准库的重要组成部分,提供了通用的模板类和函数,用于实现常用的数据结构和算法。STL 主要包括以下六大组件:

  1. 容器(Containers)

    • 用于存储数据的结构,如 vectorlistmap 等。
    • 容器可以分为序列容器(如 vectorlist)和关联容器(如 mapset)。
  2. 分配器(Allocators)

    • 用于管理内存分配和释放,如 allocator
    • 分配器可以与容器配合使用,提供灵活的内存管理。
  3. 算法(Algorithms)

    • 提供各种操作,如排序、搜索、遍历等,如 sortfindcount 等。
    • 算法通常与迭代器和容器配合使用。
  4. 迭代器(Iterators)

    • 用于遍历容器中的元素,如 begin()end()
    • 迭代器可以分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。
  5. 适配器(Adapters)

    • 用于扩展容器和迭代器的功能,如 vectorpush_backpop_back
    • 适配器可以将一种容器或迭代器转换为另一种形式。
  6. 仿函式(Functors)

    • 用于实现函数对象,如 lessgreater 等。
    • 仿函式可以与算法配合使用,提供灵活的操作。
二、STL 六大组件关系

STL 的六大组件之间相互配合,形成了一个强大的工具集。以下是一个具体的例子,展示了这些组件的使用:

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>

using namespace std;

int main() {
    int ia[] = {27, 210, 12, 47, 109, 83};
    vector<int, allocator<int>> vi(ia, ia + 6);

    cout << count_if(vi.begin(), vi.end(), not1(bind2nd(less<int>(), 40))) << endl;

    return 0;
}
  • 容器(Containers)vector<int, allocator<int>> vi 用于存储整数数组 ia
  • 分配器(Allocators)allocator<int> 用于管理内存分配。
  • 算法(Algorithms)count_if 用于统计满足条件的元素数量。
  • 迭代器(Iterators)vi.begin()vi.end() 用于遍历容器中的元素。
  • 适配器(Adapters)not1bind2nd 用于调整函数对象的行为。
  • 仿函式(Functors)less<int> 用于比较两个整数的大小。
三、复杂度分析

在使用 STL 时,了解算法和操作的复杂度是非常重要的。常见的复杂度表示法(Big-oh)包括:

  1. O(1) 或 O©:常数时间(constant time)。

    • 示例:访问数组中的元素。
  2. O(n):线性时间(linear time)。

    • 示例:遍历一个数组或链表。
  3. O(log₂n):次线性时间(sub-linear time)。

    • 示例:二分查找。
  4. O(n²):平方时间(quadratic time)。

    • 示例:冒泡排序。
  5. O(n³):立方时间(cubic time)。

    • 示例:三重循环。
  6. O(2ⁿ):指数时间(exponential time)。

    • 示例:递归计算斐波那契数列。
  7. O(n log₂n):介于线性及二次方增长的中间行为模式。

    • 示例:快速排序、归并排序。
四、迭代器的使用

迭代器是 STL 中的重要组件,用于遍历容器中的元素。迭代器的使用需要注意“前闭后开”区间,即 [begin, end)

Container<T> c;
...
Container<T>::iterator ite = c.begin();
for (; ite != c.end(); ++ite) {
    ...
}
  • begin():返回容器的第一个元素的迭代器。
  • end():返回容器的最后一个元素的下一个位置的迭代器。
五、范围 for 循环

C++11 引入了范围 for 循环(range-based for loop),简化了遍历容器的代码。

for (int i : {2, 3, 5, 7, 9, 13, 17, 19}) {
    std::cout << i << std::endl;
}

std::vector<double> vec;
...
for (auto elem : vec) {
    std::cout << elem << std::endl;
}

for (auto& elem : vec) {
    elem *= 3;
}
  • auto:自动推导类型,简化代码编写。
  • auto&:引用类型,用于修改容器中的元素。
六、auto 关键字

C++11 引入了 auto 关键字,用于自动推导类型,简化代码编写。

list<string> c;
...
list<string>::iterator ite;
ite = ::find(c.begin(), c.end(), target);

list<string> c;
...
auto ite = ::find(c.begin(), c.end(), target);
  • auto:自动推导 find 函数返回的迭代器类型,简化代码编写。

总结

通过学习,我对 STL 的六大组件及其关系有了更深入的理解。老师帮助我掌握 STL 的核心概念和应用技巧。特别是对复杂度分析、迭代器的使用和范围 for 循环的介绍,为后续的面向对象编程和高级开发打下了坚实的基础。

在实际编程中,合理使用 STL 可以显著提高代码的可读性和可维护性。同时,理解算法的复杂度,有助于选择合适的算法和数据结构,提高程序的性能。

在未来的学习和工作中,我将继续深入探索 STL 的高级特性,并将其应用到实际项目中,以提升自己的编程能力。

相关文章:

  • 【react】基础教程
  • 【Linux-网络】从逻辑寻址到物理传输:解构IP协议与ARP协议的跨层协作
  • 求解动态完全未知的连续时间非线性系统的优化控制的全局自适应动态规划算法
  • KubeSphere平台安装
  • 面试八股文--数据库基础知识总结(1)
  • 应无所住而生其心:心灵的自在与解脱
  • 深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分
  • 中国的Cursor! 字节跳动推出Trae,开放Windows版(附资源),开发自己的网站,内置 GPT-4o 强大Al模型!
  • Flutter使用permission_handler请求通知权限不会弹出权限弹窗
  • C语言(13)------------>do-while循环
  • Teigha(ODA<Open Design Alliance>_开放设计联盟)——cad c# 二次开发
  • 英式英语与美式英语的单词拼写差异
  • 第4章 4.3 EF Core 的实体类配置 Data Annatation Fluent API
  • 死锁是什么
  • git 小乌龟安装包及中文包
  • 计网学习————(二)
  • 第十三:路由两个注意点:
  • web组态可视化编辑器
  • C语言函数学习笔记
  • 【js面试】JavaScript中执行栈和执行上下文是什么?
  • 特朗普与普京开始电话会谈,稍后将致电泽连斯基
  • 国家主席习近平任免驻外大使
  • 多图|多款先进预警机亮相雷达展,专家:中国预警机已达世界先进水平
  • 经济日报:人工智能开启太空经济新格局
  • 上海这个咖啡文化节首次“走出去”,率本土品牌亮相英国伦敦
  • 视频丨歼-10CE首次实战大放异彩