说起STL(标准模板库),相信了解C++的都不会陌生吧^_^。LZ是从大三开始学习C++(ps:不是科班出身),并慢慢接触使用STL的,在学校中使用STL比较多的情况是写数据结构代码,使用STL实现数据结构代码(我的数据结构源码),使我们专注于考虑算法思想,不拘泥于底层代码实现。

  这里LZ不讲STL的具体知识,只讨论关于STL的学习和使用问题!结合LZ的学习过程,LZ觉得C++的学习(当然,这其中包括的STL)大致路线如下:

  1. 学习C++基本语法
  2. 掌握类、继承、多态等概念
  3. 理解面对对象和泛型编程思想
  4. 了解并使用STL(标准模板库)
  5. 阅读STL主要的代码实现,加深对STL的理解
  6. 探索C++对象模型(这样就理解了类对象的内存布局问题,多态是如何实现的...)

  学习C++(包括STL),当然少不了阅读书籍,尤其是经典书籍,参考上面的学习路线,对应的推荐书籍如下:

  1/2/3:《C++ Primer》 对C++基本概念、技术、以及现代C++编程风格进行了全面而且权威的阐述,是C++初学者的最佳指南,圣经级书籍。

  4/5:《STL源码剖析》 深入分析STL源代码(SGI版本),帮助你加深对STL的理解,以后使用STL就放心大胆了。

  6:《深度探索C++对象模型》 专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟—虚拟函数和虚拟继承,帮助你理解程序的底层实现,以便写出更高效的代码。

  当然,在学习的过程中,可以同时阅读《Effective C++》,帮助你写出更加健壮的C++代码。学习C++以及STL阅读这几本书,其他的C++书籍大可不必再看了。

1、STL是什么

  STL(Standard Template Library 标准模板库)是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件,STL现在是C++的一部分。

  STL提供了六大组件,并且组件彼此间可以组合套用:

  • 容器(Containers):各种数据结构,如:vector、list、deque、set、map。用来存放数据。从实现的角度来看,STL容器是一种class template。
  • 算法(algorithms):各种常用算法,如:sort、search、copy、erase。从实现的角度来看,STL算法是一种 function template。
  • 迭代器(iterators):容器与算法之间的胶合剂,是所谓的“泛型指针”。共有五种类型,以及其他衍生变化。从实现的角度来看,迭代器是一种将 operator*、operator->、operator++、operator- - 等指针相关操作进行重载的class template。所有STL容器都有自己专属的迭代器,只有容器本身才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
  • 仿函数(functors):行为类似函数,可作为算法的某种策略(policy)。从实现的角度来看,仿函数是一种重载了operator()的class或class template。一般的函数指针也可视为狭义的仿函数。
  • 配接器(adapters):一种用来修饰容器、仿函数、迭代器接口的东西。例如:STL提供的queue 和 stack,虽然看似容器,但其实只能算是一种容器配接器,因为它们的底部完全借助deque,所有操作都由底层的deque供应。改变 functors接口者,称为function adapter;改变 container 接口者,称为container adapter;改变iterator接口者,称为iterator adapter。
  • 配置器(allocators):负责空间配置与管理。从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template。

STL六大组件将的交互关系

2、公司实际项目中到底该不该用STL呢

  网上关于STL的讨论还是很多的,比如为何某些公司不允许使用STL?STL到底该不该用?...这里结合LZ的实际工作经历,来谈谈STL的使用问题,LZ目前在某华做安防平台开发,项目中就使用了STL,不过项目中使用的大都是STL中容器、迭代器部分,像算法等其他部分很少使用。LZ觉得,在实际项目中使不使用STL,主要看项目的实际需求,根据具体使用场景来取舍。该安防平台主要负责与设备通信、存储设备发送上来的图片和视频、与web端交互等,由于平台接入设备有限,所以不会有很大的并发量,使用STL完全满足要求了。

  使用STL,避免了底层数据的封装处理,更专注于业务逻辑实现;但是使用STL可能会产生代码膨胀问题、内存使用效率问题、类型隐式转换问题,这些问题在项目中数据量较大或者项目并发要求比较高就会成为性能瓶颈的,注意,STL容器不是线程安全的,在多线程中使用需要自己实现加锁操作。

3、继续学习C++

  学习C++,除了经典书籍外还有另外一个比较重要的资源,那就是开源代码。阅读开源代码,不进可以了解源码规范,还可以深入了解该系统是如何实现的,加深对技术的理解。阅读源码的同时,自己可以尝试造轮子,关于C++,有几个比较经典的源码:

  • leveldb:Google出品,遵循Google C++编码规范。作者是Jeff Dean大神。
  • libevent:是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。
  • TeamTalk:蘑菇街开源的即时通信软件,有PC、Android、Ios版本,其中Server端是C++实现。
  • ...

参考资料

  1、为何某些公司不允许使用 C++ STL?

  2、《STL源码剖析》第一章节部分

  3、C++实现的数据结构源码

我的STL学习之路的更多相关文章

  1. STL学习之路

    本文面向的读者:学习过C++程序设计语言(也就是说学习过Template),但是还没有接触过STL的STL的初学者.这实际上是我学习STL的一篇笔记,老鸟就不用看了. 什么是泛型程序设计 我们可以简单 ...

  2. 我的QT5学习之路(一)——浅谈QT的安装和配置

    一.前言 说到Qt,不能不说到C++,这门伟大的语言.因为其面向对象的编程思想和陡峭的学习曲线,一开始学习起来很是吃力.Qt从QT4开始基本封装了很多C++的工具库和界面库,而且支持跨平台,这是它最大 ...

  3. Java学习之路(转)

    Java学习之路(书籍推荐)   一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多 ...

  4. <2014 05 09> Lucida:我的算法学习之路

    [转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...

  5. Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON

    Home / Qt 学习之路 2 / Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON  豆子 ...

  6. Qt 学习之路 2(40):隐式数据共享

    Qt 学习之路 2(40):隐式数据共享 豆子 2013年1月21日 Qt 学习之路 2 14条评论 Qt 中许多 C++ 类使用了隐式数据共享技术,来最大化资源利用率和最小化拷贝时的资源消耗.当作为 ...

  7. Qt 学习之路 2(39):遍历容器

    Qt 学习之路 2(39):遍历容器 豆子 2013年1月16日 Qt 学习之路 2 29条评论 上一节我们大致了解了有关存储容器的相关内容.对于所有的容器,最常用的操作就是遍历.本章我们将详细了解有 ...

  8. Qt 学习之路 2(38):存储容器

    Qt 学习之路 2(38):存储容器 豆子 2013年1月14日 Qt 学习之路 2 38条评论 存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特 ...

  9. Qt 学习之路 2(2):Qt 简介

    Home / Qt 学习之路 2 / Qt 学习之路 2(2):Qt 简介 Qt 学习之路 2(2):Qt 简介  豆子  2012年8月21日  Qt 学习之路 2  43条评论 Qt 是一个著名的 ...

随机推荐

  1. 原生JS:Object对象详细参考

    Object对象详细参考 本文参考MDN做的详细整理,方便大家参考MDN JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象. 构造函数: Objec ...

  2. Java WebService 开发简单实例

    Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以 ...

  3. [ javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中 ] javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中方法演示 效果之三

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  4. Android存储访问及目录

    Android存储访问及目录 Android的外部存储 Android支持外部存储(case-insensitive filesystem with immutable POSIX permissio ...

  5. 看代码学知识之(2) ListView无数据时显示其他View

    看代码学知识之(2) ListView无数据时显示其他View 今天看的一块布局是这样的: <!-- The frame layout is here since we will be show ...

  6. Objective-C 快速入门--基础(二)

    1.什么是继承?OC中的继承有哪些特点? “继承”是面向对象软件技术当中的一个概念.如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类&quo ...

  7. 【代码笔记】iOS-背景色随机显示

    一,效果图. 二,工程图. 三,代码. RootViewController.h RootViewController.m - (void)viewDidLoad { [super viewDidLo ...

  8. XML解析之DOM详解及与SAX解析方法的比较

    XML解析(DOM) XML文件解析方法介绍 我们所用到的NSXMLParser是采用SAX方法解析 SAX(Simple API for XML) 只能读,不能修改,只能顺序访问,适合解析大型XML ...

  9. css简介及相关概念

    一.简介: css全称为级联样式表(Cascading Style Sheet),通常又称为风格样式表(Style Sheet),是用来进行网页风格设计的.  css优点: 内容与表现分离 表现的统一 ...

  10. Win8.1RTM英文版安装中文语言包的两种方法

    Windows 8.1和Windows Server 2012 R2 RTM出来了,下载了个英文版的安装上了,发现远景上有朋友提供中文语言包,以下提供两种语言包的安装方法: 一.使用lpksetup命 ...