博客
关于我
STL笔试面试题总结(干货)(转)
阅读量:408 次
发布时间:2019-03-06

本文共 2229 字,大约阅读时间需要 7 分钟。

STL笔试面试题总结

一、STL组件概述

STL(标准模板库)提供了六大核心组件,彼此可以组合套用:

  • 容器

    容器是各种数据结构,具体包括:

    • vector:动态数组,支持快速随机访问。
    • list:双向链表,支持快速增删。
    • deque:双向队列,支持首尾快速增删和随机访问。
    • stack:堆栈,仅支持头部和尾部操作。
    • queue:队列,仅支持头部和尾部操作。
    • priority_queue:优先队列,基于堆实现。
    • set:有序集合,基于红黑树。
    • multiset:有序多重集合,基于红黑树。
    • map:有序映射,基于红黑树。
    • multimap:有序多重映射,基于红黑树。
    • hash_set:无序集合,基于哈希表。
    • hash_multiset:无序多重集合,基于哈希表。
    • hash_map:无序映射,基于哈希表。
    • hash_multimap:无序多重映射,基于哈希表。
  • 算法

    提供常用算法,如排序、搜索、复制、删除和反转等,算法是模板函数。

  • 迭代器

    迭代器是连接容器和算法的桥梁,主要有以下类型:

    • 输入迭代器:只支持读取操作。
    • 输出迭代器:只支持写入操作。
    • 前向迭代器:支持前向遍历。
    • 双向迭代器:支持双向遍历。
    • 随机访问迭代器:支持直接访问容器中的元素。
  • 仿函数

    仿函数是算法操作的策略,通过重载 operator() 方法实现。

  • 容器配接器

    用于修饰容器或仿函数接口,例如 queuestack实际上是 deque 的配接器。

  • 空间配置器

    负责内存管理,提供动态内存分配和释放功能。

  • 二、常用容器特点

    容器类型 特点 适用场景
    vector 连续内存存储,支持随机访问 适合随机存取,元素操作简单
    list 双向链表,支持快速增删 适合对象大,操作频繁,插入删除高效
    deque 双向队列,支持首尾快速操作和随机访问 适合同时支持随机访问和队列操作
    stack 堆栈,仅支持头部和尾部操作 适合先进后出,操作简单
    queue 队列,仅支持头部和尾部操作 适合先进先出,操作简单
    priority_queue 优先队列,基于堆实现 适合处理优先级任务
    set 有序集合,基于红黑树 适合有序插入、查找,元素唯一
    multiset 有序多重集合,基于红黑树 适合有序插入、查找,元素可重复
    map 有序映射,基于红黑树 适合有序映射,键值对唯一
    hash_set 无序集合,基于哈希表 适合快速查找,不关心顺序
    hash_map 无序映射,基于哈希表 适合快速查找,不关心顺序
    multiset 有序多重集合,基于红黑树 适合有序多重元素的插入、查找
    multimap 有序多重映射,基于红黑树 适合有序多重键值对的插入、查找

    三、STL容器的选择依据

  • 随机访问:选择 vectordeque,因为它们支持快速随机访问。
  • 频繁插入删除:选择 listdeque,因为它们支持首尾快速操作。
  • 对象大:选择 list,因为链表存储更高效。
  • 有序操作:选择 setmultisetmapmultimap,因为它们支持有序插入和查找。
  • 无序操作:选择 hash_sethash_multisethash_maphash_multimap,因为它们支持快速查找。
  • 四、容器的插入和删除

    • vector:插入和删除时,会触发内存重分配,导致迭代器失效。
    • list:插入和删除时,会重新连接节点,迭代器不会全部失效。
    • deque:插入和删除时,会调整内存布局,迭代器会失效。
    • stackqueue:仅支持头部或尾部操作,迭代器不会全部失效。

    五、迭代器失效情况

    • vectordeque:插入或删除时会改变内存布局,所有迭代器失效。
    • list:插入或删除时,只有被操作节点的迭代器失效,其他迭代器有效。
    • mapsetmultiset:插入或删除时,只有当前节点的迭代器失效。

    六、STL内存管理

    STL使用双层级配置器:

  • 一级配置器:使用 mallocfree
  • 二级配置器:管理小块内存,避免碎片。
    • 对于小于128字节的小块,使用 memory_pool 管理。
    • 配置时会将需求上调至8的倍数,释放时会将碎片插入相应的自由列表。
  • 七、容器与算法结合使用

    • 算法std::sort 通常与 vectordeque 结合使用。
    • std::remove 只是将元素移到尾部,不会真正删除元素。

    八、红黑树性质

  • 结点颜色:红色或黑色。
  • 根节点:黑色。
  • 叶节点:黑色(表示空节点)。
  • 子节点关系:红色结点的子节点必须是黑色。
  • 路径性质:任何路径到叶节点的黑色结点数必须相等。
  • 九、容器与迭代器的关系

    • vectordeque 提供随机访问迭代器,但后者迭代器实现复杂。
    • queuestack 不提供直接的迭代器,仅支持头部操作。
    • mapset 提供双向迭代器,但节点访问只支持读取。

    十、内存优化

    STL通过内存池管理小块内存,减少碎片,提高利用率。这种机制不适用于通用内存分配,需要知道内存块大小才能释放。

    十一、容器选择建议

    • 随机访问频繁vector
    • 频繁插入删除listdeque
    • 有序操作setmap
    • 无序操作hash_sethash_map

    十二、总结

    选择合适的容器和算法,可以提高程序性能和可读性。熟悉容器的内存机制和迭代器行为,有助于避免内存泄漏和逻辑错误。

    转载地址:http://qfbkz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现tanh函数功能(附完整源码)
    查看>>
    Objective-C实现z-algorithm算法(附完整源码)
    查看>>
    Objective-C实现zellers congruence泽勒一致算法(附完整源码)
    查看>>
    Objective-C实现Zero One Knapsack零一背包计算算法(附完整源码)
    查看>>
    Objective-C实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)
    查看>>
    Objective-C实现一个通用的堆算法(附完整源码)
    查看>>
    Objective-C实现一分钟倒计时(附完整源码)
    查看>>
    Objective-C实现三次样条曲线(附完整源码)
    查看>>
    Objective-C实现上传文件到FTP服务器(附完整源码)
    查看>>
    Objective-C实现两数之和问题(附完整源码)
    查看>>
    Objective-C实现串口通讯(附完整源码)
    查看>>
    Objective-C实现串逐位和(附完整源码)
    查看>>
    Objective-C实现主存储器空间的分配和回收(附完整源码)
    查看>>
    Objective-C实现乘方运算---m的n次方(附完整源码)
    查看>>
    Objective-C实现二叉树遍历算法(附完整源码)
    查看>>
    Objective-C实现二进制补码算法(附完整源码)
    查看>>
    Objective-C实现交易密码算法(附完整源码)
    查看>>
    Objective-C实现低通滤波器(附完整源码)
    查看>>
    Objective-C实现使用管道重定向进程输入输出(附完整源码)
    查看>>
    Objective-C实现关系矩阵A和B的乘积(附完整源码)
    查看>>