现在的位置: 首页 > 综合 > 正文

C++ Primer学习第三天

2017年12月04日 ⁄ 综合 ⁄ 共 3331字 ⁄ 字号 评论关闭

第三章 标准库类型

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流

抱歉!评论已关闭.