转自:http://www.cnblogs.com/ggjucheng/archive/2012/01/03/2310884.htmlhtml
转自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html通过两篇博文融合整理获得ios
C++ STL能够分为标准容器,算法和函数对象,迭代器和分配器。程序员
利用C++标准程序库,能够大量减小咱们的代码,提升代码的稳定性和健壮性。算法
C++标准容器分为序列容器和关联容器。编程
一、对于序列容器,C++提供的基本序列有设计模式
vector 支持随机访问,不适合作插入和删除操做频繁的场景数组
list 双向链表,适合作元素的插入和删除,不是随机访问数据结构
deque 也是一个双端序列,可是通过优化,其双端操做效率相似list,随即访问效率接近vector。ide
从它们出发,经过定义适当的借口,生成了函数
stack 默认用deque实现
queue 默认是deque实现
priority_queue 默认是vector保存元素,实现最多是heap
二、对于关联容器,C++提供的有:
map 映射
mulitimap 多重映射,相比map,容许重复的key
set 被看作是一个map,其中的值是可有可无的
mulitiset 相比set,容许重复的key
bitset 位集合
hash_map 散列映射,经过实现一个散列函数,将容器实现为一个散列表,以减小查找元素所须要的时间
标准容器具体用法能够参考C++在线手册STL容器:http://www.cplusplus.com/reference/stl/
容器自己之因此有用,是由于容器提供了一些基本操做,如肯定大小,迭代,复制,排序,查找等。标准库提供了许多算法,服务于容器用户的最广泛和最基本的须要。标准库算法不过就是60个,每一个算法都描述为一个模板函数或一组模板函数,例如最经常使用的排序算法:sort,能以很好的平均效率排序,建议排序都用sort替换C语言的qsort,sort能够更好结合容器。标准库算法和函数对象的教程能够参考C++之父的C++程序设计语言的算法和函数对象,这一章内容能够教你如何使用标准库算法和函数对象。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
标准库算法具体用法参考C++在线手册STL算法:http://www.cplusplus.com/reference/algorithm/
一、迭代器是链接容器和算法的纽带,让写算法的人没必要关心各类数据结构的具体细节,而分配器提供了一个映射,将低级的字节形式的数据模型映射到高级的对象模型。迭代器是每一个程序员都须要关心的概念之一,可是分配器仅仅是一个支持机制,标准库已经提供了默认的分配器,不多有程序员须要去写新的分配器。迭代器在接触STL容器就会了解了,通常迭代器分为正向迭代器,反向迭代器,插入迭代器,带检查的迭代器。
几乎STL提供的全部算法都是经过迭代器存取元素序列进行工做的,每个容器都定义了其自己所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。
二、分配器提供了一套分配和释放存储的标准方式,标准库提供了一个标准分配器,在<memory>里的标准allocator模板用operator new()分配存储,全部的标准容器在默认状况下使用它,固然你也能够本身实现一个分配器,容器的实现须要一次次的allocate()或者deallocate()对象,意味着new的大量调用,你能够采用一个固定大小存储块的存储池,能够比常规的更通用的operator new()的效率高一些。
C++学习的50条忠告:
1.把C++当成一门新的语言学习;
2.看《Thinking In C++》,不要看《C++变成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要由于他们很难而咱们本身是初学者因此就不看;
4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而咱们要学的是一门语言;
5.不要放过任何一个看上去很简单的小编程问题——他们每每并不那么简单,或者能够引申出不少知识点;
6.会用Visual C++,并不说明你会C++;
7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和竭尽全力的博览群书;
8.若是不是天才的话,想学编程就不要想玩游戏——你觉得你作到了,其实你的C++水平并无和你通关的能力一块儿变高——其实能够时刻记住:学C++是为了编游戏的;
9.看Visual C++的书,是学不了C++语言的;
16.把时髦的技术挂在嘴边,还不如把过期的技术记在内心;
18.学习编程最好的方法之一就是阅读源代码;
19.在任什么时候刻都不要认为本身手中的书已经足够了;
20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
22.别期望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
25.和别人一块儿讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪一个好;
26.请看《程序设计实践》,并严格的按照其要求去作;
27.不要由于C和C++中有一些语法和关键字看上去相同,就认为它们的意义和做用彻底同样;
28.C++毫不是所谓的C的“扩充”——若是C++一开始就起名叫Z语言,你必定不会把C和Z语言联系得那么紧密;
29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
30.读完了《Inside The C++ Object Model》之后再来认定本身是否是已经学会了C++;
31.学习编程的秘诀是:编程,编程,再编程;
32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;
34.请把书上的程序例子亲手输入到电脑上实践,即便配套光盘中有源代码;
35.把在书中看到的有意义的例子扩充;
36.请重视C++中的异常处理技术,并将其切实的运用到本身的程序中;
37.常常回顾本身之前写过的程序,并尝试重写,把本身学到的新知识运用进去;
38.不要漏掉书中任何一个练习题——请所有作完并记录下解题思路;
39.C++语言和C++的集成开发环境要同时学习和掌握;
40.既然决定了学C++,就请坚持学下去,由于学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
41.就让C++语言的各类平台和开发环境去激烈的竞争吧,咱们要以学习C++语言自己为主;
42.当你写C++程序写到一半却发现本身用的方法很拙劣时,请不要立刻停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,而后分析本身的错误并从新设计和编写(参见43);
43.别心急,设计C++的class确实不容易;本身程序中的class和本身的class设计水平是在不断的编程实践中完善和发展的;
44.决不要由于程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别人交流时发现的本身忽视或不理解的知识点;
47.请不断的对本身写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
48.保存好你写过的全部的程序——那是你最好的积累之一;
49.请不要作浮躁的人;
50.请热爱C++!
学会应用能够学习理论:考虑看下C++之父的C++程序设计语言的标准库,也能够看更厚的书:C++标准程序库。
最后,你在工做和编程中,都须要C++容器和算法的手册查阅,这些能够参考上面的网址:
C++在线手册STL容器:http://www.cplusplus.com/reference/stl/
C++在线手册STL算法:http://www.cplusplus.com/reference/algorithm/
这里面详细介绍了每一个容器和算法的每一个函数,几乎95%都有例子,是很好的参考资料
C++头文件一览
C、传统 C++
#include <assert.h> 设定插入点
#include <ctype.h> 字符处理
#include <errno.h> 定义错误码
#include <float.h> 浮点数处理
#include <fstream.h> 文件输入/输出
#include <iomanip.h> 参数化输入/输出
#include <iostream.h> 数据流输入/输出
#include <limits.h> 定义各类数据类型最值常量
#include <locale.h> 定义本地化函数
#include <math.h> 定义数学函数
#include <stdio.h> 定义输入/输出函数
#include <stdlib.h> 定义杂项函数及内存分配函数
#include <string.h> 字符串处理
#include <strstrea.h> 基于数组的输入/输出
#include <time.h> 定义关于时间的函数
#include <wchar.h> 宽字符处理及输入/输出
#include <wctype.h> 宽字符分类
标准 C++
#include <algorithm> 通用算法
#include <bitset> 位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> 复数类
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque> 双端队列容器
#include <exception> 异常处理类
#include <fstream>
#include <functional> 定义运算函数(代替运算符)
#include <limits>
#include <list> 线性列表容器
#include <map> 映射容器
#include <iomanip>
#include <iOS> 基本输入/输出支持
#include <iosfwd> 输入/输出系统使用的前置声明
#include <iostream>
#include <istream> 基本输入流
#include <ostream> 基本输出流
#include <queue> 队列容器
#include <set> 集合容器
#include <sstream> 基于字符串的流
#include <stack> 堆栈容器
#include <stdexcept> 标准异常类
#include <streambuf> 底层输入/输出支持
#include <string> 字符串类
#include <utility> 通用模板类
#include <vector> 动态数组容器
#include <cwchar>
#include <cwctype>
C99 增长
#include <complex.h> 复数处理#include <fenv.h> 浮点环境#include <inttypes.h> 整数格式转换#include <stdbool.h> 布尔环境#include <stdint.h> 整型环境#include <tgmath.h> 通用类型数学宏