建设宣传网站上的请示,娄底网站建设的公司,吉林网站建设业务,网站建设效果图本文已收录至《C语言和高级数据结构》专栏#xff01; 作者#xff1a;ARMCSKGT 文章目录 前言正文简介关于STL各种版本 STL组件容器迭代器配接器(适配器)算法仿函数空间配置器 STL的重要性学习STL的意义如何学习STL STL的缺陷 最后 前言
STL(standard tem… 本文已收录至《C语言和高级数据结构》专栏 作者ARMCSKGT 文章目录 前言正文简介关于STL各种版本 STL组件容器迭代器配接器(适配器)算法仿函数空间配置器 STL的重要性学习STL的意义如何学习STL STL的缺陷 最后 前言
STL(standard template libaray-标准模板库)是C标准库的重要组成部分不仅是一个可复用的组件库而且是一个包罗数据结构与算法的软件框架。 正文 简介 关于STL STL(Standard TemplateLibrary)标准模板库从根本上说STL是一些数据结构的集合因为是组织和存放数据简称为容器这些“容器”有list、vector、set、map等STL也是算法和其他一些组件的集合。STL的目的是标准化组件这样就不用重新开发可以使用现成的组件。 STL包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C程序员们提供了一个可扩展的应用框架高度体现了软件的可复用性。从逻辑层次来看在STL中体现了泛型化程序设计的思想generic programming。在这种思想里大部分基本算法被抽象被泛化独立于与之对应的数据结构用于以相同或相近的方式处理各种不同情形。 STL作者亚历山大·斯特潘诺夫(Alexander Stepanov)STL之父并因此而荣获第一届Dr. Dobb’s 程序设计杰出奖现在是Adobe公司首席科学家。他曾是康柏电脑公司的副总裁和首席科学家ATT实验室副总裁和首席架构师SGI服务和超级计算机业务首席技术官。 各种版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本本着开源精神他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。P. J. 版本 由P. J. Plauger开发继承自HP版本被Windows Visual C采用不能公开或修改缺陷可读性比较低符号命名比较怪异。RW版本 由Rouge Wage公司开发继承自HP版本被C Builder 采用不能公开或修改可读性一般。SGI版本 由Silicon Graphics Computer SystemsInc公司开发继承自HP版 本。被GCC(Linux)采用可移植性好可公开、修改甚至贩卖从命名风格和编程 风格上看阅读性非常高。如果我们想学习STL源码建议阅读SGI版本。 STL组件 容器 序列式容器 -string字符串 -vector顺序表 -array数组 -list链表 -deque双端队列关联式容器 -set集合(底层是红黑树) -map映射(底层是红黑树) 这些容器在实现的基础上通过模板类进行封装除了string以外其他容器都支持泛型关于序列式容器里面的元素是线性的而关联式容器里面的元素是有一定关系的一般为K或KV(keyvalue)模型。其中一些容器还可以变换成具有其他特性的相同容器例如wstring宽字符串multimap多键映射等。 迭代器 iterator普通迭代器const_iterator常量迭代器reverse_iterator反向迭代器const_reverse_iterator常量反向迭代器 我们知道循环可以称为迭代当我们遍历一个数组时既可以用 [ ] 和 数组下标 访问也可以用 数组首地址 和 偏移量 解引用访问STL为了统一大部分容器的访问方式定义了迭代器访问迭代器可以想象成是对指针的封装我们使用只需要 解引用 然后 或就能到任何元素然后进行访问或修改这样使我们学习STL的成本降低了不少而且后期很多迭代器都支持 范围for 语法糖而范围for的实现原理就是基于迭代器的 迭代器扮演容器与算法之间的胶合剂是所谓的“泛型指针”所有STL容器都附带有自己专属的迭代器原生指针(Native pointer)也是一种迭代器。 配接器(适配器) 容器适配器 在STL中容器适配器有queue队列stack栈等这些容器我们在使用C语言时发现其存储结构既可以使用顺序表也可以使用链表也就是顺序栈顺序队链栈和链队列所以这些容器只需要对某些序列容器进行封装而改变该容器的行为就能实现且这些容器都具有相同的插入删除例如push_back和pop_back等即可这样就完成了对象的组合迭代器适配器 基于容器适配器的介绍我们可以对某个容器进行封装改变该容器的行为就能实现适配器容器那么对于迭代器来说如果我们对普通迭代器进行封装就能实现反向迭代器因为我们只需要改变普通迭代器的行为就行了。仿函数适配器 仿函数本身就非常厉害仿函数适配器则可以无限制的创造出各种可能的表达式关于仿函数的我们在后面会结合代码进行介绍。 算法 find查找swap交换sort排序reverse逆置等… 我们在学习数据结构时算法是必不可少的增删查改难免需要算法的优化对于一些固定常用的算法库中已经帮我们实现了我们只需要使用algorithm头文件即可这些算法对于大部分容器都是适配可用的因为迭代器是统一的这是当初设计者的巧妙之处而对于某些特殊的数据结构其算法会在类中实现封装在一起这样就实现了算法的高效利用各种常用算法如SortSearchCopyErase从实现的角度来看STL算法是一种Function Templates。 仿函数 仿函数的实现是通过类中重载 () 运算符实现的这样我们可用将对象当作函数使用仿函数的出现使我们的函数作为参数传参更加方便在C语言qsort中比较函数需要自己实现和传参而在C中只需要传递仿函数对象即可这样既好理解也方便使用在C的一些比较算法和关联式容器中就需要函数对象控制比较例如排序的升序和降序通过less和greater仿函数控制map的建树比较规则也是通过less和greater控制所以仿函数的地位是不可比拟的 空间配置器 我们学习动态内存管理时通过new可用向堆申请空间使用完毕后delete释放但是底层其实是C语言去调用系统接口申请内存这样在一般的简单使用场景下没有问题但是对于频繁申请和释放内存时效率非常低。于是我们可用预先向系统申请一大块空间进行管理需要空间时去这一大块空间上取释放时伪释放这样就不需要总是通过系统接口申请内存了我们只需要维护好这一大块空间即可这样就极大的提高了内存使用效率而这种技术也称为内存池技术对于频繁申请和释放内存的场景非常实用STL引入内存池技术也是为了极致的性能发挥 STL的重要性 学习STL的意义 STL在日常使用的非常之多其实现原理和里面的一些算法思想非常值得我们去学习而且在面试时公司必考。网上有句话说“不懂STL不要说你会C”。STL是C中的优秀作品有了它的陪伴许多底层的数据结构以及算法都不需要自己重新造轮子站在前人的肩膀上健步如飞的快速开发。 如何学习STL 学习STL的使用了解STL的底层实现熟练使用STL甚至扩充STL 简单总结一下学习STL的三个境界能用明理能扩展 。 STL的缺陷 STL库的更新太慢了。这个得严重吐槽上一版靠谱是C98中间的C03基本一些修订;C11出来已经相隔了13年STL才进一步更新。STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。STL极度的追求效率导致内部比较复杂。比如类型萃取迭代器萃取。STL的使用会有代码膨胀的问题比如使用vector/vector/vector这样会生成多份代码当然这是模板语法本身导致的。 最后
STL的简单介绍到这里就介绍了学习和熟练使用STL对于我们的C学习之路有着极大的帮助后面我们会对STL中的常用容器进行详细的介绍和实现相信STL会助力我们更加高效的开发
本次 C STL-简介 就先介绍到这里啦希望能够尽可能帮助到大家。
如果文章中有瑕疵还请各位大佬细心点评和留言我将立即修补错误谢谢 其他文章阅读推荐 C 模板 -CSDN博客 C 内存管理 -CSDN博客 C 类和对象 - 下 -CSDN博客 C 类和对象 - 中 -CSDN博客 C 类和对象 - 上 -CSDN博客 欢迎读者多多浏览多多支持!