除低级数据类型,C++标准库还定义了许多更高级的抽象数据类型(abstract data type),比如string,vector,bitset。
命名空间的using声明
使用using声明可以在不需要加前缀namespace_name::的情况下访问命名空间中的名字。
using namespace::name;
一个using声明一次只能作用于一个命名空间成员。
如:
using std::cin;
using std::cout;
using std::enl;
标准库string类型
#include<string>
using std::string;
string标准库支持几个构造函数,如:
string s1; //陌生人构造函数,s1为空串
string s2(s1); //将s2初始化为s1的一个副本
string s3("value"); //将s3初始化为一个字符串字面值副本
string s4(n,'c'); //将s4初始化为字符'c'的n个副本
因为历史原因及为了与C语言兼容,字符串字面值(比如:“value”)与标准库string类型不是同一类型@!!
string对象的读写
1、用cin
cin >> s;
string类型的输入操作符:
读取并忽略开头所有空白字符(如空格,换行,制表)
读取字符直到再次遇到空白字符,读取终止。
2、用getline
从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。!!并不忽略行开头的换行符!!如果第一个字符就是换行符,则string被指为空string。
遇到空格不会停止,会把空格记录下来。
string对象的操作
s.empty()
s.size()
s[n]
s1 + s2(s3 = s1 + s2; s1 += s2; s3 = s1 + "," + s2 + "/n";)
s1 = s2
v1 == v2
!= , < , <= , > , >=同上
当进行string对象和字符串字面值混合连接操作时,+ 操作符的左右操作数必须至少有一个是string类型的:
string s1 = "hello"; //ok
string s2 = "world"; //ok
string s3 = s1 + ", "; //ok
string s4 = "hello" + ", "; //error
string s5 = s1 + ", " + "world"; //ok
string s6 = "hello" + ", " + s2; //error
s1[0]第一个字符
s[s.size() - 1]最后一个字符
任何可产生整型值的表达式都可用作下标操作符的索引。
string::size_type
string对象中字符的处理,在cctype头文件中定义:p77
标准库vector类型
容器,包含#include<vector>,using std::vector;
vector<int> ivec;
vector<Sales_item> Sales_vec;
vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。
几种初始化vector对象的方式
迭代器(iterator),各种容器都定义了自己的iterator类型,可替代下标操作
vector<int>::iterator iter;
begin和end操作。
vector<int>::iterator iter = ivec.begin();
const_iterator,指向const对象的引用,它自身的值可以改变,但不能用来改变其所指向的元素的值(只读取容器内元素(不能改变))。
不要把const_iterator对象和const的iterator对象混淆。
const_iterator对象可用于const vector 或非const vector,而const迭代器几乎没用。
迭代器的算术操作:
iter + n
iter - n //加减的类型应该是vector的size_type或difference_type类型
iter1 + iter2
定位于vector的中间元素:
vector<int>::iterator mid = vi.begin() + vi.size() / 2; //效率比逐个自增要高
vector<int>::iterator mid = ( vi.begin() + vi.size() ) /2; //错误的,因为( vi.begin() + vi.size() ) /2返回的是difference_type的signed类型,而mid是iterator类型
标准库bitset类型
#include <bitset>
using std::bitset;
与vector不一样的是bitset类型对象的区别仅在其长度而不在于其类型。
bitset<32> bitvec; //32 bits,all zero
给出的长度值必须是常量表达式,长度值必须定义为整型字面值常量或是已用常量值初始化的整型的const对象。
初始化bitset对象的方法 :p88
bitset<n> b;
bitset<n> b(u);
bitset<n> b(s);
bitset<n> b(s,pos,n);
用unsigned值初始化bitset对象
用string对象初始化bitset对象,注意读入位集是从右向左!!可以只用某个子串作为初始值; //p89
注意用某个子串初始化时,pos也是从右开始计算的。
bitset对象上的操作 //p90