| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2908 人关注过本帖, 2 人收藏
标题:C++标准库的学习笔记
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
结帖率:96%
收藏(2)
 问题点数:0 回复次数:24 
C++标准库的学习笔记
    C++标准库是个极为庞大的体系,因此面面俱到的介绍几乎是不可能的。而且任何一个系统都有其复杂的一面,我觉得即使是只介绍 C 的标准库其工作量也是巨大的,所以我这次整理的内容只也是从宏观入手。介绍 C++标准库相关细节的文章(或书籍)有不少,不同的文章也有各自的侧重点。我觉得了解C++标准库有助于加深对 C++ 的理解,因此我想整理一下自己的学习心得,也可以使大家从另一个角度认识一下 C++。因为我曾经看到有位版主也说过 string 类的底层是 vector<char> 这么不靠谱的话,所以才觉得介绍介绍这些方面的知识也挺有意义。
    语法并不是一个语言的全部,学习一门语言的精力经常是放在学习它的库上,或是内置库,或是扩展库,第三方库。不过精力应该放在学习库的用法上,而不是掌握库的结构或实现,所以我这篇文章准备谈及的内容也比较偏,不过依然有可能激发一些人的学习兴趣。大家应该了解,语法像 C++ 这般复杂的语言是绝无仅有的,很多简单的语言,只要愿意,半小时就能学尽它的语法,并且这种语言依然很有效。(对于熟悉 Linux 的人来说,一个很好的例子是 bash,即使它对 sh 的语法做了如此之多的扩展,你仍能在半小时之内掌握它的全部语法。)
    我这么说的意图是,即使通晓C++的语法(先不论是否能够通晓)也许也无法理解它的设计哲学。标准库也是 C++ 的一个很重要的组成部分,这是我觉得这篇文章确实值得一写的另一个原因。

标准库的组成:
    前言就到此为止。从最宏观的层面上看,C++标准库由十个部分组成:语言支持、诊断、通用工具、字符串、本地化、容器、迭代器、通用算法、数值算法和I/O。相信其中有很多是大家已经熟知的了,我也不会详细地介绍每个部分。关于容器、迭代器和算法相关的细节与原理,我认为参考侯捷老师的《STL源码剖析》是非常适宜的。虽然其中也有少量的错误的,但无法掩盖它的价值。相信我的这篇文章错误会更多,因为我对 C++ 确实知之甚少。

名空间std:
    所有的标准库定义的东西,除了宏、operator new 和 operator delete(马上我就会解释宏,而 new 和 delete 我将在介绍语言支持的时候介绍)都在 std,或者是内嵌在 std 里的名空间里面。
(也许大家不熟悉这种语法。下面的例子定义了两个名空间 outer 和 inner。inner 就是内嵌在 outer 里的。它们都独立于 std:
程序代码:
#include <iostream>
using std::cout;
using std::endl;

namespace outer {
    int a = 5;
    namespace inner {
        int a = 10;
    }
}
using namesapec outer;

int main()
{
    cout << a << endl;     // 输出:5
    cout << inner::a << endl; // 输出:10

    return 0;
}

)

头文件组成:
    C++ 标准库一共包含 33 个C++ 头文件:
<algorithm>, <bitset>, <complex>, <deque>, <exception>,  <fstream>,  <functional>,
<iomanip>, <ios>, <iosfwd>, <iostream>, <istream>, <iterator>,  <limits>,  <list>,
<locale>, <map>, <memory>, <new>, <numeric>, <ostream>, <queue>, <set>, <sstream>,
<stack>, <stdexcept>, <streambuf>, <string>, <strstream>,  <typeinfo>,  <utility>,
<valarray>, <vector>
和 18 个 C的标准库头文件:
<cassert>, <cctype>, <cerrno>, <cfloat>, <ciso646>, <climits>,  <clocale>,  <cmath>,
<csetjmp>, <csignal>, <cstdarg>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>,
<cwchar>, <cwctype>
    再次强调,所有的头文件都不以 .h 结尾。且除了宏以外,都定义在名空间std 里。宏是预处理对象,它不在名空间里是件很自然的事情,因为对宏的处理发生在编译之前。但这经常引起混淆,比如 errno (在 <cerrno> 里)就是一个宏。如果以为它是一个 int,从而使用 std::errno 这样的语句,那么就会出错,而且往往编译器报的错误看上去还非常古怪。另外有一些看上去像函数的宏也常常引发问题,不过这个概率要小一些,因为在 C 的实践中,它们也老出问题,从而累积了不少经验。

以下划线开始的标识符:
    标准规定,以双下划线开始(如 __USE_GNU)或者以单下划线开始并跟一个大写字母(如_M_gcount,这两个标识符出自 gcc)的名字是保留给实现的(也就是说标准库里不用这样的名字);任何以单下划线开始的名字是保留给实现和标准库的。所以我们应当避免自己定义这样的名字,这样可以使阅读代码的人很清楚,一但下划线出现,必然是在引用标准库或者实现的特性。

库函数的可重入性:
    标准并没有规定 C++ 的库函数是否是可重入的,这就需要程序员自己斟酌可能出现的情况。

    OK,对标准库的概述就是这样,是不是感觉也很简单?我希望我可以做到深入浅出。当然这只是个开始,我马上准备介绍的是语言支持。如果有时间,我还准备陆续介绍一下标准库的那其它组成部分。我很乐意看到大家提出意见或建议。

[ 本帖最后由 pangding 于 2012-4-3 09:14 编辑 ]
搜索更多相关主题的帖子: 学习心得 而且 工作量 文章 知识 
2012-03-31 01:58
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
语言支持(已完成,非常长):
https://bbs.bccn.net/thread-364885-1-1.html
诊断(已完成):
https://bbs.bccn.net/thread-366209-1-1.html

我先占几楼备用。

[ 本帖最后由 pangding 于 2012-4-20 01:27 编辑 ]
2012-03-31 01:58
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
占座。
2012-03-31 01:59
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
侯捷老师的《STL源码剖析》这本在学习C++的时候,的确是本有参考价值的书啊。
关于String类的设计,STL设计得并不好,这点偶希望从P版的学习笔记中点到。
支持P版。

我们都在路上。。。。。
2012-03-31 10:50
rifei09528
Rank: 1
等 级:新手上路
帖 子:2
专家分:5
注 册:2012-3-31
收藏
得分:0 
学习来的,谢谢楼主!
2012-03-31 18:37
pcfine
Rank: 1
来 自:湖北
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-3-31
收藏
得分:0 
我在大学正学的是计算机专业,老师讲得不好,想自学,所以求到这来了。
2012-03-31 22:44
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 4楼 hellovfp
呵呵。我应该不会评价它设计的好不好。历来大家对 C++ 的评价都是褒贬不一。至于它到底设计的是好是坏,大家可以有自己的看法。
我这回的主要目的是客观的陈述,想让更多的人认识标准库而已。加上一点自己的理解也是为了帮助大家理解,当然多说一点自己的理解更有可能暴露出自己认识上的错误,有利于教学相长。

写这个文章,主观上说,我当 C++ 版主也好久了,偶尔也想给咱这个版块贡献点技术帖。所以这回挑了个有一定挑战的,相对也冷门一点的话题写写文章。
客观上说,一是我很多年前研究过C++标准,对标准库也有一定的了解。二是手头上本来就有些资料,写起来也不会花太多精力查。但架不住标准库太大了,虽然我会不定期更新一下,但也可能随时搁浅。因此我预计是先挑大家不太熟悉又比较有意思的部分介绍,至于容器、迭代器之类的这种各大书籍都会介绍的部分,我目前看来是没有介绍的打算。
2012-04-02 20:58
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
支持 p 版,最好置顶一下,方便大家阅读

[ 本帖最后由 BlueGuy 于 2012-4-4 08:39 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2012-04-04 08:27
fhaoquan
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2010-8-27
收藏
得分:0 
前排发言,支持楼主。学习了。
2012-04-04 09:53
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:0 
什么是p版?求教。

panding版主是在北京吗???五月份我也去北京了,多照顾啊

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-04-05 11:45
快速回复:C++标准库的学习笔记
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028772 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved