C++Primer读书笔记(第三章)

来源:互联网 发布:淘宝榫卯实木家具 编辑:程序博客网 时间:2024/05/16 09:07

第三章标准库类型

3.1 命名空间的using声明

每个名字都需要一个using声明,但是有一种情况,必须总是使用完全限定的标准库名字:在头文件中。理由是,在头文件中放置using声明,就相当于在包含该头文件的所有程序中都放置了同一using声明。

3.2 标准库string类型

千万注意,string类型与字符串字面值不是同一类型。string对象最后没“\n”。

#include  <string>

using  std::string;

3.2.1 string对象的定义和初始化

         string  s1;                         //默认构造函数

         string  s2 (s1);                 //将s2初始化为s1的一个副本

         string  s3 (“value”);        //将s3初始化为字符串字面值的一个副本

         string  s4 (n, ‘c’);             //将s4初始化为n个字符’c’的副本

3.2.2 string对象的读写

         (1)标准输入读取string:

         读取并忽略开头所有空白字符(空格、换行符、制表符);

         读取字符直至再次遇到空白符为止。

         (2)用getline读取整行文本:

         istream  getline (istream  cin, string line);

         不忽略开头的换行符,只要遇到换行符就停止,不保存最后的换行符。即便它是第一个输入符,line被置为空sting。

3.2.3 string对象的操作

string s;                  //s为字符组对象

(1)s.size(),返回字符串s中字符的个数,其数据类型不是整型,而是string::size_type类型(是一个unsigned类型)。不能把size的返回值赋给一个int变量。

(2)s.empty(),返回字符串s是否为空的布尔值。

(3)支持关系操作符<,<=,>,>=。比较时采用和(大小写敏感)字典排序相同的策略。

(4)支持赋值操作,但是确实存在效率问题。

(5)支持两个string对象相加。

(6)支持和字符串字面值的连接。当进行string对象和字符串字面值混合连接时,+操作符的左右操作数必须至少一个是string类型。

string s1 (“hello, ”);      string  s2 (“world\n”);            string  s3 = s1 +s2;

string s1 (“hello”);    string  s3 = s1 + “, world”;    //效果等同于上一行!

(7)支持下标操作,从0开始,s[s.size() - 1]是最后一个字符。并且下标操作可用作左值,更改字符串的某个字符。索引值应该用sting::size_type类型变量,这样保证索引值不小于0,并且会自动检测不超过上界s.size() – 1。

3.2.4 string对象中字符的处理

对单个字符的操作函数,在cctype头文件中!

isalnum(c)         //是数字或者字母,则为true;  isalpha(c)                //是字母,则为true;

iscntrl(c)            //控制符           isdigit(c)            //数字               isgraph(c)                   //不是空格,但可打印

islower(c)                   //小写               isupper(c)         //大写               isprint()             //可打印字符

ispunct(c)                   //标点符号      isspace(c)                   //空白字符     

tolower(c)         //转为小写      toupper(c)        //转为大写

3.3 标准库vector类型

vector是同一种类型的对象集合,属于容器的一种。vector只是一个类模板,可以指定任意类型的对象,比如: vector<int>  ivec;                   vector<string>           svec;

#include  <vector>

using  std::vector;

3.3.1 vector对象的定义和初始化

vector<T>  v1;                 //默认构造函数,v1为空

vector<T>  v2 (v1);         //v2是v1的副本

vector<T>  v3 (n, i);        //v3包含n个值为i的元素

vector<T>  v4 (n);           //v4含有值初始化元素的n个副本

vector对象的重要属性就在于可以在运行时高效地添加元素,后续详解。

3.3.2 vector对象的操作

(1)v.empty()和v.size(),赋值,比较等等操作。

(2)v.push_back(T  val); 将新值插入到vector对象v的后面。

(3)vector的下标操作只能进行对已有元素的索引,不能进行添加元素操作。

3.4迭代器简介

         除了使用下标来访问vector对象的元素,标准库还提供了迭代器访问元素的方法。迭代器是一种检查容器内元素并遍历元素的数据类型。所有标准库容器都定义了相应的迭代器类型!

3.4.1 容器的iterator类型

         vector<int>::iterator  iter;

3.4.2 begin和end操作

         如果容器中有元素的话,由begin返回的迭代器指向第一个元素:

         vector<int>::iterator  iter = ivec.begin();

         由end操作返回的迭代器指向vector的末端元素的下一个,指向一个不存在的元素。如果vector为空,则begin和end返回的迭代器相同。end只是起个哨兵作用,表示已处理完vector中所有元素。

3.4.3 vector迭代器的自增和解引用运算

迭代器使用解引用操作符(*)来访问迭代器所指向的元素:

*iter = 0;

++iter;      //表示指向下一个元素

3.4.4 迭代器的其它操作

         如果两个迭代器指向同一个元素,那么久==,否则为!=。

3.4.5 迭代器的应用程序示例

         for(vector<int>::iterator  iter =ivec.begin(); iter != ivec.end(); ++iter)

                   *iter= 0;

3.4.6 const_iterator

         每个容器还定义了一种名为const_iterator的类型,只能用于读取容器内的元素,但不能改变其值。

         当我们对普通iterator类型解引用时,得到对某个元素的非const引用。而如果对const_iterator类型解引用时,则可以得到一个指向const对象的引用。

vector<int>::const_iterator  iter = ivec.begin();

3.4.7 迭代器的算术操作

         iter1– iter2; 用于计算两个迭代器对象的距离,是名为difference_type的signed类型的值。与size_type类型类似,但是是有符号的。

iter + n; 加减的值不是整型,而是size_type或者difference_type。

vector<int>::iterator  mid = ivec.begin() + ivec.size() / 2;

热河改变vector长度的操作都会使已存在的迭代器失效。例如,在调用push_back之后,就不能再信赖指向vector的迭代器的值了。

3.5 标准库bitset类型

         bitset类简化二进制位的有序集(都是0,1)的处理。bitset也是一种类模板,但是其尽在长度上有区别,如bitset<32>  bitvec;。

#include  <bitset>

using  std::bitset;

3.5.1 bitset对象的定义和初始化

bitset<n>  b;                    //b有n位,都为0

bitset<n>  b(u);               //b是unsigned  long型u的一个副本

bitset<n>  b(s);                //b是string对象s中含有的位串的副本

bitset<n>  b(s, pos, n);  //b是s中从位置pos开始的n个位的副本

注:当用string对象初始化bitset对象时,从string对象读入位集的顺序是从右向左

string  strval (“1100”);           bitset<32> bitvec (strval);

bitset中第2,3位是1,其余都为0。

3.5.2 bitset对象上的操作

(1)b.any();           //b中是否存在置为1的位?   b.none();            //b中全0?

         b.count();                   //b中位为1的个数                          b.size();             //b中的总位数

         count和size返回的值类型都为size_t类型,定义在cstddef头文件中,也是一个unsigned有关的类型,其大小足以保证存储内存中对象的大小。

(2)b[pos];             //下标操作               b.text(pos);//下标为pos位是否为1?

b.set();//所有位都置1            b.reset(); //所有位都置0       b.flip();     //所有位都取反

         b.set(pos);//pos位置1            b.reset(pos);//pos位置0        b.flip(pos);//pos位取反

(3)b.to_ulong();           //用b中同样的二进制位返回一个unsigned  long值

         os<< b;                       //把b中的位集输出到os流。

         bitset<32>  bitvec (0xffff);

         cout<< “bitvec: ” << bitvec << endl;                 //输出结果

0 0
原创粉丝点击