第三章 标准库类型
1、标准库string类型
string类型支持长度可变的字符串,该类型的目的就是满足对字符串的一般应用。
string对象的初始化方式:
string s1;//默认方式,s1为空串
string s1(s2);//s1是s2的副本
string s1(“value”);//将s1初始化为一个字符串字面值的副本
string s1(n,'c');//将s1初始化为有n个字符c的字符串
2、string对象的读写
程序有多种方法接受从键盘输入的字符串。
第一种,使用cin>>string:
比如下面的程序段:实现从标准输入读入一组字符串,然后逐行输出
int main()
{
string word;
while(cin>>word)
{
cout<<word<<endl;
}
return 0;
}
使用cin>>stirng读取字符串的规则是:
a、忽略开头所有的空白字符,比如空格、换行、制表符
b、读取字符直到遇到空白字符,读取终止
对于上面的程序,如果我们输入:“ this is a test! ”
运行结果应该是:
this
is
a
test!
可以说,cin>>string是使用空白符作为分隔符,把空白符之间的所有字符按照一个字符串来处理。所以使用这种方法不能输入带有空白符的字符串。
第二种,使用getline()函数
这个函数接受两个参数:一个输入流,一个字符串对象。getline函数从输入流读取一行,并保存到string对象中,但不包括换行符。getline不忽略开头的换行符,只要遇到换行符,即便是第一个字符,getline也将停止读入并返回。如果第一个字符是换行符,则string参数将被置为空string。
下面的程序实现从标准输入按行读取字符串:
int main()
{
string line;
while(getline(cin,line))
{
cout<<line<<endl;
}
return 0;
}
其实getline函数有三个参数,最后一个参数是行的结束符,默认是回车。遇到这个字符才表示一行结束了,才会输出它前面的字符串。
3、string操作
s.empty();//如果s为空,返回true,否则返回false
s.size();//返回s中字符的个数
s[n];//返回s中位置为n的字符,位置从0开始计数,返回值是一个左值
s1 + s2;//返回s1和s2连接到一起的新的字符串
s1 = s2;//把s1替换为s2
s1 == s2;//比较s1和s2是否相等
!=,<,<=,>,>=//字符串比较
注意:string s = "aaa" + "bbb";这是非法的。+操作符的左右操作数至少要有一个是string类型的。
string a = "aaa";
string s = a + "bbb";//这是正确的,因为a是一个string类型的对象
4、标准库vector类型
vector是同一种类型的对象的集合。我们把它叫做一种容器。
比如:
vector<int> ivec;//定义了一个用于存储多个int类型变量的容器
vector<string> svec;// 定义了一个用于存储多个string类型对象的容器
一个容器中存储的对象必须是同一类型的。
vector对象的定义和初始化:
vector<Type> v1; //v1为空
vector<Type> v1(v2);//v1是v2的副本
vector<Type> v1(n,i);//v1中包含n个值为i的元素
vector<Type> v1(n)://v1含有Type类型的默认值的n个副本
对于最后一种初始化形式,举例如下:
vector<int> v1(10);//该语句会得到一个有10个元素的vector,每个元素都是int型的默认值"0"
vector<string> v1(10);//该语句会得到一个有10个元素的vector,每个元素都是string型的默认值"空字符串"
就是说,对于每一种数据类型,标准库都规定了一个默认值,vector<Type> v1(n)将会使用默认值去初始化vector,从而得到一个含有10个元素(每个元素都是默认值)的vector
5、vector对象的操作
v.empty()//如果v为空,返回true
v.size()//返回v中元素的个数
v.push_back(t)//在v的末尾追加一个元素
v[n]//下标操作,返回v中位置为n的元素,位置从零开始,返回值是一个左值
v1 = v2//把v1中的元素替换为v2中元素的副本
v1 == v2//如果v1与v2相等,返回true
!=,<,<=,>,>=//判断
注意:下标操作只能操作已存在的数据,所以下标操作不能向vector中添加元素,只能读取和修改
6、迭代器
迭代器是一种检测容器内元素并遍历元素的数据类型。
标准库为每一种标准容器(包括vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下表操作。
vector<int>::iterator iter;这条语句就定义了一个vector<int>::iterator类型的迭代器。
每种容器都定义了一对命名为begin和end的函数,用于返回一个迭代器。
begin函数返回的迭代器指向第一个元素,如果容器不为空的话。end函数返回容器“末端的下一个”,通常成为“超出末端迭代器”。如果容器为空,begin和end返回的迭代器相同。
例:vector<int>::iterator iter = ivec.begin();//返回的迭代器指向ivec的第一个元素
迭代器的解引用和自增操作:
可以使用解引用操作符(*操作符)来访问迭代器指向的元素:*iter = 0表示把迭代器当前指向的元素置为0
如果iter指向vector对象ivec的第一个元素,那么*iter和ivec[0]表示同一个意思。
++iter就是自增操作,表示把容器中的迭代器“向前移动一个位置”,如果iter指向第一个元素,那么自增之后就指向第而个元素。
示例程序:把容器中的每个元素都置为1
vector<int> ivec(10);
for(vecot<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{
*iter = 1;
}
7、标准库bitset类型
使用bitset可以处理二进制位的有序集。//只能处理0和1
定义和初始化:
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个位的副本
注意:初始化时,使用上面的后面两种种形式时,给b赋的值中只能包含0和1,不能包含其它字符,应为“使用bitset可以处理二进制位的有序集”。
例:bitset<16> bitvec1(0xffff);
bitset<16> bitvec2("110001")//字符串中只能包含0和1
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_long() //返回一个unsigned long值
os<<b //把b中的位集输出到os流