[3.2 标准库 string 类型]
P70 #include <string>
using std::string
P70 几种初始化string对象的方式:
string s1;//默认构造函数,s1为空串
string s2(s1);//将s2初始化为s1的一个副本
string s3("value");//将s3初始化为一个字符串字面值副本
string s4(n, 'c');//将s4初始化为字符'c'的n个副本
P72 getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略行开头的换行符。只要getline遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。
string s1, s2;
cin >> s1;
cout << s1 << endl;
getline(cin, s2);
cout << s2 << endl;
P72 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
!=, <, <=, >, >= //保持这些操作符惯有的含义
P73 判断string对象是否为空:if(st.size() == 0) orif(st.empty())。
P73 通过配套类型,库类型的使用就能与机器无关(machine - independent)。
P73 size()函数返回size_type类型的值。
P75 当进行string对象和字符串字面值混合链接操作时,+ 操作符的左右操作数必须至少有一个是string类型的。
string s4 = "hello" + ",";//error: no string operand
string s5 = s1 + "," + "world";//ok, each + has string operand
P75 string类型通过下标操作符([])来访问string对象中的单个字符。下标操作符需要取一个size_type类型的值,来标明要访问字符的位置。这个下标中的值通常被称为“下标”或“索引(index)”。
P76string str("some string");
for(string::size_type ix = 0; ix != str.size(); ++ix)
cout << str[ix] <<endl;
P76 任何可产生整型值的表达式都可用作下标操作符的索引,但索引的实际数据类型却是unsigned类型string::size_type。
P77 cctype头文件中定义的字符操作函数:(详见book)
isalnum(c)//如果c是字母或数字,则为true
isalpha(c)//如果c是字母,则为true
iscntrl(c)//如果c是控制字符,则为true
isdigit(c)//如果c是数字,则为true
isgrahp(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类型]
P77 #include <vector>
using std::vector;
P79 几种初始化vector对象的方式:
vector<T> v1;//vector保存类型为T的对象。默认构造函数,v1为空
vector<T> v2(v1);//v2是v1的一个副本
vector<T> v3(n, i);//v3包含n个值为i的元素
vector<T> v4(n);//v4含有值初始化的元素的n个副本
P80 建议先初始化一个空vector对象,然后再动态地增加元素。
P81 vector操作:
v.empty()//如果v为空,则返回true,否则返回false
v.size()//返回v中元素的个数。成员函数size返回相应vector类定义的size_type的值。
v.push_back(t)//在v的末尾增加一个值为t的元素
v[n]//返回v中位置为n的元素,位置从0开始计数
v1 = v2//把v1的元素替换为v2中元素的副本
v1 == v2//比较v1与v2的内容,相等则返回true,否则返回false
!=, <, <=, >, >= //保持这些操作符惯有的含义
P81 使用size_type类型时,必须指出该类型是在哪里定义的。vector类型总是包括vector的元素类型:vector<int>::size_type
P82 C++程序员习惯于优先选用 != 而不是 < 来编写循环判断条件。
P83 下标只能用来获取已存在的元素。
[3.4 迭代器iterator简介]
P84 迭代器iterator是一种检查容器内元素并遍历元素的数据类型。
P84 标准库为每一种标准容器定义了一种迭代器类型,而只有少数的容器支持下标操作。
P84 每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回的迭代器指向第一个元素;由end操作返回的迭代器指向vector的“末端元素的下一个”。通常称为超出末端迭代器(off - the - end iterator),表明它指向了一个不存在的元素。如果vector为空,begin返回的迭代器与end返回的迭代器相同。
P85 迭代器使用自增操作符向前移动迭代器指向容器中下一个元素。
P85 用 == 或 != 操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。
P87 迭代器的算术操作(iterator arithmetic)
iter + n, iter - n :加上或减去的值得类型应该是vector的size_type或difference_type类型
iter1 - iter2:该距离是名为difference_type的signed类型的值
P88 任何改变vector长度的操作都会使已存在的迭代器失效。
[标准库bitset类型]
P88 #inlcude <bitset>
using std::bitset;
P88 在定义bitset对象时,要明确bitset含有多少位,须在尖括号内给出它的长度值。给出的长度值必须是常量表达式。长度值必须定义为整型字面值常量或是已用常量值初始化的整型的const对象。
P88 初始化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个位的副本
P89 从string对象读入位集的顺序是从右向左。
P90 bitset操作
b.any();//b中是否存在置为1的二进制位?
b.none();//b中不存在置为1的二进制位吗?
b.count();//b中置为1的二进制位的个数,返回类型是标准库中命名为size_t的类型,该类型定义在cstddef头文件中
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流
P91 to_ulong操作返回一个unsigned long值,该值与bitset对象的位模式存储值相同。仅当bitset类型的长度小于或等于unsigned long的长度时,才可以使用to_ulong操作。
P92 总的来说,相对于C++内置数据类型的数组和指针而言,程序员应优先使用标准库类类型。