第3章 标准库类型
目录
3.1 命名空间的using声明
3.2 标准库string类型
3.3 标准库vector类型
3.4 迭代器简介
3.5标准库bitset类型
3.1 命名空间的using声明
1.每个名字都需要一个using声明
必须要为用到的每个名字都提供一个using声明。
2.使用标准库类型的类定义
在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明。
3.2 标准库string类型
string类型支持长度可变的字符中;使用前请首先
#include <string> using std::string;
3.2.1 string对象的定义和初始化
几种初始化String对象的方式
| string s1; | 默认构造函数,s1为空串 |
| string s2(s1); | 将s2初始化为s1的一个副本 |
| string s3("value"); | 将s3初始化为一个字符串字面值副本 |
| string s4(n,’c'); | 将s4初始化为字符’c'的n个副本 |
3.2.2 String对象的读写
string类型的输入操作符:
读取并忽略开头所有的空白字符(如空格,换行符,制表符)。
读取字符直至再次遇到空白字符,读取终止。
允许把多个读操作或多个写操作放在一起。
1.读入未知数目的string对象
string的输入操作符也会返回所读的数据流。因此,可以把输入操作作为判断条件。
2.用getline读取整行文本
getline(stream-in,string);
getline 并不忽略行开头的换行符。只要GETLINE遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。getline函数将istream参数作为返回值,和输入操作符一样也把它用作判断条件。
3.2.3 string对象的操作
string操作
| s.empty() | 判断s是否为空串,是返回true,否则返回false |
| s.size() | 返回s中字符的个数 |
| s[n] | 返回s中位置为n的字符,位置从0开始计数 |
| s1+s2 | 把s1和s2连接成一个新的字符串,返回新生成的字符串 |
| s1=s2 | 把s1内容替换为s2副本 |
| v1==v2 | 比较v1和v2,相等则返回true,否则返回false |
| !,=,<,<=,>,>= | 保持这些操作符惯有的含义 |
1.string的size和empty操作
string对象的长度指的是string对象中字符的个数,可以通过size操作获取,了解string对象是否为空:
if (st.size() == 0) // ok: empty if (st.empty()) // ok: empty
2.string::size_type类型
size成员函数返回的是string::size_type类型的值,该库类型隐藏了与机器相关的取值类型。size_type与unsigned型具有相同的含义。
任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。
3.string关系操作符
string对象比较运算是区分大小写的,任何一个大写字母都小于任意的小写字母。如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小于长的string对象。 如果两个string对象的字符不同,则比较第一个不匹配的字符。
4.string对象的赋值
可以把一个string对象赋值到另一个string对象。
5.两个string对象相加
string对象的加法被定义为连接。也就是说,两个(或多个)string对象可以通过使用加操作符+或者复合赋值操作符+=连接起来。
6.和字符串字面值的连接
当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的:
string s1 = "hello"; // no punctuation string s2 = "world"; string s3 = s1 + ", "; // ok: adding a string and a literal string s4 = "hello" + ", "; // error: no string operand string s5 = s1 + ", " + "world"; // ok: each + has string operand string s6 = "hello" + ", " + s2; // error: can't add string literals
7.从string对象获取字符
string类型通过下标操作符([])来访问string对象中的单个字符。下标操作符需要取一个size_type类型的值。
8.下标操作可用作左值(可以被赋值)
9.计算下标值
任何可产生整型数值的表达式都可用作下标操作符的索引。在使用下标索引string对象时,必须保证索引值“在上下界范围内”。
3.2.4 string对象中字符的处理
cctype头文件中定义:
| isalnum(c) | 如果c是字母或数字,则为true。 |
| isalpha(c) | 如果c是字母,则为true。 |
| iscntrl(c) | 如果c是控制字符,则为true。 |
| isdigit(c) | 如果c是数字,则为true。 |
| isgraph(c) | 如果c不是空格,但可输出,则为true。 |
| islower(c) | 如果c是小写字母,则为true。 |
| isprint(c) | 如果c是可输出的字符,则为true。 |
| ispunct(c) | 如果c是标点符号,则为true。 |
| isspace(c) | 如果c是空白字符,则为true。 |
| isupper(c) | 如果c是大写字母,则为true。 |
| isxdigit(c) | 如果c是十六进制数,则为true。 |
| tolower(c) | 如果c是大写字母,则返回其小写字母形式,否则直接返回c。 |
| toupper(c) | 如果c是小写字母,则返回其大写字母形式,否则直接返回c。 |
可打印的字符是指那些可以显式表示的字符。空白字符则是空格、制表符、垂直制表符、回车符、换行符和进纸符中的任意一种;标点符号则是除了数字、字母或(可输出的)空白字符(如空格)以外的其他字符。
3.3 标准库vector类型
vector称为容器,是一个类模板。vector声明:
vector<int> ivec; // ivec holds objects of type int vector<Sales_item> Sales_vec; // holds Sales_items
3.3.1 vector对象的定义和初始化
vector类构造函数
| vector<T> v1; | vector保存类型为T的对象。默认构造函数为空 |
| vector<T> v2(v1); | v2是v1的一个副本 |
| vector<T> v3(n,i); | v3包含n个值为i的元素 |
| vector<T> v4(n); | v4含有值初始化的元素的n个副本 |
1.创建确定个数的元素
当把一个vector对象复制到另一个vector对象时,新复制的vector中每一个元素都初始化为原vector中相应元素的副本。但这两个vector对象必须保存同一种元素类型。构造函数用元素个数来决定vector对象保存元素的个数,元素值指定每个元素的初始值。
vector对象动态增长(高效)。
2.值初始化
如果vector保存内置类型(如int类型)的元素,那么标准库将用0值创建元素初始化值,如果向量保存类类型(如string)的元素,标准库将用该类型的默认构造函数创建元素初始值。
3.3.2 vector的操作
| v.empty() | 如果v为空,则返回true,否则返回false |
| v.size() | 返回v中元素的个数 |
| v.pushback(t) | 在v的末尾增加一个值为t的元素 |
| v[n] | 返回v中位置为n的元素 |
| v1==v2 | 如果v1和v2相等,则返回true |
| v1=v2 | 把v1的元素替换为v2中元素的副本 |
| !,<,<=,>,>= | 保持惯有含义 |
1.vector对象的size
成员函数size返回相应vector类定义的size_type的值。使用size_type类型时,必须指出该类型是在哪里定义的:
vector<int>::size_type
2.向vector添加元素
push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面。
3.vector的下标操作
4.下标操作不添加元素
必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。
警告:仅能对确知已存在的元素进行下标操作。
3.4 迭代器简介
迭代器是一种检查容器内元素并遍历元素的数据类型。
1.容器的iterator类型
vector<int>::iterator iter;
这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
2.begin和end操作
vector<int>::iterator iter = ivec.begin();
返回迭代器指向的第一个元素。
由end操作返回的迭代器指向vector的“末端元素的下一个”。通常称为超出末端迭代器,表明它指向了一个不存在的元素。
3.vector迭代器的自增和解引用运算
迭代器类型可使用解引用操作符(*操作符)来访问迭代器所指向的元素,迭代器使用自增操作符向前移动迭代器指向容器中下一个元素。
4.迭代器的其他运算
5.迭代器应用的程序示例
6.const_iterator
对const_interator类型解引用时,得到一个指向const对象的引用,该对象不能重写。
7.迭代器的算术操作
包括:iter+n,iter-n,产生一个位置在iter所指元素之前(加)或之后(减)n个元素的位置。加或减之后的结果必须指向iter所指vector中的某个元素,加上或减去的值的类型应该是vector的size_type或different_type类型。iter1-iter2,产生两迭代器之间的距离;类型为different_type,它是signed类型。
注意:任何改变vector长度的操作都会使迭代器失效。
3.5 标准库bitset类型
#include <bitset>
using std::bitset;
3.5.1 bitset的定义和初始化
在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:
bitset<32> bitvec; //32位,全为0。
长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。
初始化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个位的副本 |
1.用unsigned值初始化bitset对象
当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。如果bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位置为0;如果bitet类型长度小于unsigned long值的二进制位数,则只使用unsigned值中的低阶位,超过bitet类型长度的高阶位将被丢弃。
// bitvec1 is smaller than the initializer bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1 // bitvec2 same size as initializer bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0 // on a 32-bit machine, bits 0 to 31 initialized from 0xffff bitset<128> bitvec3(0xffff); // bits 32 through 127 initialized to zero
2.用string对象初始化bitset对象
从string对象读入位集的顺序是从右向左:
string strval("1100"); bitset<32> bitvec4(strval);
bitvec4的位模式中第2和3的位置为1,其余位置都为0。
可以只用某个子串作为初始值:
string str("1111111000000011001101"); bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100 bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters
3.5.2 bitset对象上的操作
| b.any() | b中是否存在置为1的二进制位? |
| b.none() | b中不存在置为1的二进制位吗? |
| b.count() | b中置为1的二进制位的个数 |
| b.size() | b中二进制位的个数 |
| b[pos] | 访问b中在pos处的二进制位 |
|
b.test(pos) |
b中在pos处的二进制位是否为1? |
|
b.set() |
把b中所有二进制位都置为1 |
|
b.set(pos) |
把b中在pos处的二进制位置为1 |
| b.reset() | 把b中所有二进制位都置为0 |
|
b.reset(pos) |
把b中在pos处的二进制位置为0 |
|
b.flip() |
把b中所有二进制位逐位取反 |
| b.flip(pos) |
把b中在pos处的二进制位取反 |
|
b.to_ulong() |
用b中同样的二进制位返回一个unsigned long值 |
|
os << b |
把b中的位集输出到os流 |
1.测试整个bitset对象
count操作的返回类型是标准库中命名为size_t的类型,是一个与机器无关的unsigned类型。
2.访问bitset对象中的位
3.对整个bitset对象进行设置
4.获取bitset对象的值
to_ulong操作返回一个unsigned long值,该值与bitset对象的位模式存储值相同。仅当bitset类型的长度小于或等于unsigned long的长度时,才可以使用to_ulong操作。
5.输出二进制位
6.使用位操作符
About the Author
发表评论