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流