C++笔记(三)

                                  标准库和抽象数据类型                 

                                                       概论

          这本书第二章讲述了内置数据类型,第三章来到了标准库里面的抽象数据类型,因为是前几章的缘故,所以这里对标准库类型的讲解没有过多篇幅,分别介绍了串的代表string、顺序容器的代表vector、可以对位操作的bitset类等。  

         抽象数据类型:之所以说他们是抽象的,是因为在使用它们时需要关心它们是如何表示的,只需要知道这些数据类型支持哪些操作就可以了。这也就是近些年开始流行起来的所谓泛型编程,这些抽象数据类型都被定义在标准库里,所以在探索标准库之前,有必要来说说命名空间和using声明。前两章总结时分条描述显得全文不够连贯,影响了阅读时的感受,所以现在试着改变一下,我无才,下笔无文,但不能因我不才便不去尝试固有斯文,倘有文辞不妥或词不达意,还望阅者批评指正。

                                                              命名空间

                命名空间是一种将程序库名称封装起来的方法,通过这种方法可以避免和应用程序发生命名冲突问题(命名冲突发生时,程序必须等到该命名冲突获得决议后,才得以继续执行),简单的理解可以说,一个名字空间就是一个作用域,当一个程序越大时,通过名字空间去描述其中逻辑上独立的各个部分也就越重要,常规的局部作用域,全局作用域和类也都是命名空间。

          理想情况是,程序里的每个实体都属于某个可以识别的逻辑单位(“模块”),所以在理想情况下,一个非平凡的程序里的每个声明都应该位于某个名字空间里,以此指明它在程序中所扮演的逻辑角色,例外是main(),他必须是特殊的,一边运行时环境能够特殊对待

          using声明如下

       (1) using namespace::name;

       (2)using namespace std;

           对于声明(1)国内的C++教本都未出现这种形式,而国外C++大牛们均推荐此种声明。对于声明(2),这种声明形式在国内高校C++教材中最为常见,但李普曼和梅耶等人极力反对,确实,在组织大型程序时,这种声明格式很糟糕。同时在组织文件时 ,using声明应该被放在头文件中,不过还有一点要注意的是,头文件应该只定义确实必要的东西。

                                                         标准库string类型

          因为这是这本书第一部分,再次就谈STL有点提前,印象中国内高校的C++教材从始至终都没有提到过它,顶多的最后提一下模版类,也属于那种老师不讲,或者一带而过的部分。并且在学校中,数据结构这门课程一般都被安排在C++之后学习,所以STL就更显陌生。本书的安排是在前面就先对标准库描述一番,也可以看见作者的良苦用心,确实,重心放在标准库上确实是现代编程的需要,而底层的编程技术更多的是体现个人的内功修为。这本书在第二部分专门开辟了三个章节来讨论容器和算法,这里介绍的串、顺序容器都在第二部分能够找到,并且详细讨论,所以这里该讨论点什么真是没有头绪,毕竟vector和以及队列不能分开讲,而单独把string分开似乎也说不过去,毕竟它和vector也有太多通的操作。这里能讲的貌似也只有bitset,但如果把东西都放在第九章去说,似乎也不太合适,因为工作量太大了,所以在这里就先讨论一部分string,应为省去了和vector共有的操作,所以这里的string一定是支离破碎的,但大体雏形应该还是能描绘出来的,确实string类型太重要了,在第九章结束以后,或许会开个专题来探讨string问题闲话不提,言归正传。

       对于string,标准库string提供了处理串的各种操作,例如下标、赋值、比较、附加、拼接和子类检索等等。并且C++允许我们使用任何字符集做为串的字符类型,包括扩充的字符集或者可移植的字符编码关于string,他的基础模版为base_string,标准库采用了两个typedef,为最常用的串类型提供了方便的名字。分别为

typedef  basic_string<char>string;

typedef basic_string<wchar_t>wstring;

其实也就是一个模版类,定义了许多对外的接口外界来调用。可以向内置类型数据一样通过cin和cout来连续输入输出,同样原因,运算符被重载了,并且返回的是流对象的引用不过当想要连续输入一行文本时,仅靠cin不能完成了,这时需要用到getline()函数,这个函数接受两个参数:一个输入流对象和一个string对象。我查了一下标准库,getline在标准库被重载了,有两种形式,分别为:

(1)istream& getline(istream &is,string &str,char delim );

  (2)   istream& getline  (istream &,string &);

其中第一种形参字符delim为终结符,用户可自定义,第二种为默认值‘/n’。之所以能读取整行文本,是因为它返回了输入流对象本身。

       对string对象的操作,这个可以说的不是太多,还是都到后回书分解,这里需要说的一点是对字符串的size操作,因为在C++中对字符串的size操作返回的结果变量必须为string::size_type类型,这也是一个typedef,相当于unsigned类型,表示数的范围要高于int,所以不能把size的返回值赋给一个int变量,就像不要把枚举变量赋给int变量一样。

     下面来简略说说关于string支持的容器操作。我把vector拿来和string做一个比较,确实有点不妥,因为string几乎支持所有常用的vector操作,除了一个只带一个长度参数的构造函数和pop_back不支持。这也意味着可将操控vector对象的程序改写为操纵string对象。不过同时string为某些容器操作提供了补充版本以支持string特有的、不为其他容器共享的属性。首先在构造上,除了和vector共有的构造方式外,string还提供了另外三种构造方式,这些构造方式通过指针操作(有的外加一个计数器),由此指定要操纵的某个元素或一段元素。(参看lippman[9.6]

     在修改string对象上,这里和string类似,也提供了一些自己特有的版本。(lippman[9.6])

     还有一部分关于算法的问题,都一并留到后文书容器与算法一节来讨论吧。

                                                                      标准库bitset类型

             有些程序要处理二进制为的有序集,每个位可能包含0值1值,位是用来保存一组项或条件的yes/no信息(标志)的简洁方法。对位的问题,C++提供了六种操作分别是为位求反、左移、右移、位与、位异或、位或。使用整形操作数,为操作符为操作符将其整形操作视为二进制位的集合,为每一位提供检验和设置的功能。但使用bitset类型相对于使用位操作符更方便也更安全。

          不过当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式而bitset对象中的位集作为这种位模式的副本。当用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右到左。

        string对象和bitset对象之间是反向转化的;string对象的最右边的字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(下标为0 的位)。并且可以只用某个string对象的子串作为初始值。

          



           


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值