C++ Primer(三)标准库类型

3.2标准库类型

3.2.1 string对象的定义和初始化

string标准库支持几个构造函数。当没有明确指出对象初始化式时,系统将使用默认构造函数

  1: string s1;        //默认构造函数,s1为空串
  2: string s2(s1);   //将s2初始化为s1的一个副本
  3: string s3("value"); //将s3初始化为一个字符串字面值的副本
  4: string s4(n,'c');//将s4初始化为字符串'c'的n个副本
  5: 

3.2.2 string对象的读写

从标准输入读string,并将读入的串存入在s中。string类型的输入操作符:

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

读取字符直至再次遇到空白字符,读取终止

2.用getline读取整行文本

getline函数从输入流的下一行读取,并保存读取到的内容到string中,但是不包含换行符。getline并不忽略开头的换行符

getline函数返回时丢弃换行符,换行符将不会存储在string对象中

3.2.3 string对象的操作

下面列出string操作

  1: s.empty()    // 如果s为空串,返回true,否则返回false
  2: s.size()       //返回s中字符的个数
  3: s[n]          // 返回s中位置为n的字符,位置从0开始计数
  4: s1+s2           // 将s1和s2连成一个新字符串,返回新生成的字符串
  5: s1=s2            // 将s1内容替换成s2的副本
  6: v1==v2         //比较v1与v2的内容,相等返回true,否则返回false
  7: !=、<         //保持这些操作符的惯有含义  
  8:  >、  
2.string::size_type类型

size操作返回的实际是string::size_type类型的值。

4.string对象的赋值

大多数string库类型的赋值等操作的实现都会遇到一些效率上的问题,赋值操作确实需要做一些工作。它必须把st1占用的相关内存释放掉,然后再分配给st1足够存放st2副本的内存空间,最后把st2中的所有字符复制到新分配的内存空间。

6.和字符串字面值的连接

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

string s6=”hello”+”,”+s2    错误

string标准库定义+操作符返回一个string对象。

8.下标操作可用作左值
9.计算下标值

任何可以产生整型值的表达式都可以用作下标操作符的索引。

3.2.4 string对象中字符的处理

下面字符操作函数,适用于string对象的字符,这些函数都在cctype头文件中定义

  1: isalnum(c)   //如果c是字母或者数字,则为true
  2: isalpha(c)    //如果c是字母,为true
  3: iscntrl(c)    //c是控制字符
  4: isdigit(c)     //是数字
  5: islower(c)     //是小写字母
  6: ispunct(c)     //是标点符号
  7: isspace(c)     //是空白字符
  8: isupper(c)     //是大写字母
  9: isxdigit(c)    //是十六进制数
 10: tolower(c)     //转换成小写字母
 11: toupper(c)     //转换成大写字母

3.3标准库vector类型

vector是同一种类型的对象的集合,每一个对象都有一个对应的整数索引值。一个容器中的所有对象必须都是用一种类型的

3.3.1 vector对象的定义和初始化

vector类定义了好几种构造函数用来定义和初始化vector对象。

  1: vector<T> v1;    //vector保存类型为T的对象。默认构造函数v1为空
  2: vector<T> v2(v1);    //v2是v1的一个副本
  3: vector<T> v3(n,i);   //v3包含n个值为i的元素
  4: vector<T> v4(n);     //v4含有值初始化的元素的n个副本
  5: 
2.值初始化

如果vector保存内置类型的元素,那么标准库将用0值创建元素初始化式

vector<int>  fvec(10);  含有10个元素,每一个元素值被初始化为0

如果vector保存的是含有构造函数的类类型的元素,标准库将用该类的默认构造函数创建元素的初始化使;

3.3.2 vector对象的操作

下面列出几项重要的操作

  1: v.empty()    //如果v为空,返回true
  2: v.size()     //返回v中元素个数
  3: v.push_back(t) //在v的末尾增加一个值为t的元素
  4: v[n]           //返回v中位置为n的元素
  5: v1=v2          //把v1中的元素替换为v2中元素的副本
  6: v1==v2         //如果v1与v2相等,返回true
1.vector对象的size

vector类型总是包括vector元素类型:

vector<int>::size_type

4.下标操作不添加元素

下标只能获取已经存在的元素

必须是已存在的元素才能用下标操作符索引

3.4 迭代器

迭代器是一种检查容器内元素并遍历元素的数据类型

标准库为每一种标准容器都定义了一种迭代器类型。

1.容器的iterator类型

每种容器类型都定义了自己的迭代器类型

vector<int>::iterator iter;

2.begin和end操作

由begin返回的迭代器指向第一个元素

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

iter即为ivec[0]

有end操作返回的迭代器指向vector的”末端元素的下一个“。通常被称为超出末端迭代器,表明它指向了一个不存在的元素。它只是起到一个哨兵的作用

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

迭代器类型定义了一些操作来获取迭代器所指向的元素

迭代器类型可以使用解引用操作符来访问迭代器所指向的元素

*iter=0;

解引用操作符返回当前迭代器所指向的元素

由于end操作返回的迭代器不指向任何元素,因此不能对其进行解引用

6.const_iterator

该类型的迭代器只能用于读取容器内的元素,但不能改变其值

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

使用const_iterator时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值

声明一个const迭代器时,必须对其进行初始化,一旦进行初始化后不能改变其值

const vector<int>::iterator iter=num.begin();此迭代器指向的元素的值可以改变,但是迭代的值不能改变

const_iterator  迭代器指向的值不能改变

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

 

3.5 标准库bitset类型

3.5.1 bitset对象的定义和初始化

bitset<32> bitvec  //32位,都为0

给出的长度值必须是常量表达式。长度值必须定义为整型字面值常量或是已经用常量值初始化的const对象

以0位开始的位串是低阶位,以31结束的位串是高阶位

  1: bitset<b> b;      //b有n位,每一位都为0
  2: bitset<n> b(u);   //b是unsigned long型u的一个副本
  3: bitset<n> b(s);   //b是string对象s中含有的位串的副本
  4: bieset<n> b(s,pos,n); //b是s中从位置pos开始的n个位的副本
1. 用unsigned 值初始化bitset对象

当用unsigned long值作为bitset对象的初始值时,该值转化为二进制的位模式。如果bitset类型长度大于unsigned long值得二进制位数,则其余高阶位将置为0;如果小于unsigned long值得二进制位数,则只是用unsigned值中的低阶位,超过bitset类型长度的高阶位将丢弃

2. 用string对象初始化bitset对象

从string对象读入位集的顺序是从右向左(string对象的最右边的字符来初始化bitset的低阶位)

3.5.2 bitset对象上的操作

  1: b.any()      //b中是否存在置1的位
  2: b.none()    //b中是否不存在置1的位
  3: b.count()   //b中置1的位有多少个
  4: b.size()    //b中的二进制位的个数
  5: b[pos]    //访问b中pos处的二进制位
  6: b.test(pos) //b中在pos位置处的二进制位是否为1
  7: b.set()    //b中所有二进制位置1
  8: b.set(pos)  //把b中在pos处的二进制位置为1
  9: b.reset()   //b中所有二进制位置为0
 10: b.reset(pos) //b中pos处的二进制位置为0
 11: b.flip()    //把b中所有二进制位逐位取反
 12: b.flip(pos)  //将b中pos位置出的二进制位取反
 13: b.to_ulong()  //将b中同样的二进制位返回一个unsigned long值
 14: os<<b          //将b中的位集输出到os流
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值