【第三章】c++里面的标准库类型

来源:互联网 发布:淘宝网上买东西 编辑:程序博客网 时间:2024/05/20 19:45

     在C++中,定义了非常丰富的抽象数据类型标准库。其中比较重要的是string和vector。string定义了大小可变的字符串,vector定义了大小可变的集合。

    标准库类型bitset,为我们提供了一种抽象方法来操作位的集合,例如二进制:000011111000,我们要对里面的每一位进行操作,例如:取反、查看位数、是否为全零、是否为全一等。标准库类型bitset就为我们提供了很多这样的方法。

标准库string类型

string标准库支持多个构造函数,就是说我们可以用不用的方法去构建相同的字符串。下面为常用的string类型构造函数。

string s1; 构造出来s1为空串string s2(s1); 构造字符串s2与s1完全相同string s3("value"); 构造字符串s3,s3初始化为valuestring s4(n,'c'); 构造字符串s4,s4的值初始化为ccccc。。。。(n个c)
        string定义了大小可变的字符串,那么就能读入位置数目的string对象。

int main(){       string word;       while (cin >> word)       cout << word << endl;       return 0;}

while 作为循环条件,当遇到输入无效的时候变停止,一般Ctrl+Z是输入结束符。

        标准库string类型给我们提供了很多的方法,例如,s.empty() 表示如果S为空串,则返回true,否则返回false。

string::size_type 类型

        该类型与unsigned型(unsigned int 或 unsigned long)具有形同的含义,最关键的是它可以保证足够大能够存储任意string长度。

       其他类型的如int 、long,能容纳一个文件内容的string对象会轻易超过。所以为了避免溢出最安全的方法就是使用标准库类型string::size_type类型

string str("some string");for (string::size_type ix=0; ix != str.size(); ++ix)      cout  <<  str[ix] << endl;
在cctype头文件中定义了很多的字符操作函数,如isalnum(c) 表示如果c是字母或数字,则为true。等等。。。


标准库vector
       标准库将负责管理与存储元素相关的内存。vector类型可以看做是高级的数组,数组一经定义后,长度不能改变,但是容器定义完成后可以改变其长度,而且提供了很多的数据操作方法。

     vector有多种构造函数

vector<T> v1; vector<T> v2(v1);vector<T> v3(n, i);vector<T> v4(n);
   vector值的初始化问题

vector<int> ivec(10,-1);           初始化10个元素,每个元素的值为-1vector<string> svec(10, "hi!");     初始化为10个字符串,每个字符串的值为“hi!”vector<int> fvec(10);               初始化为10个值,每个元素的值为0vector<string> svec(10);            初始化为10个字符串,每个字符串的初始值为空

push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面

string word;vector<string> text;while(cin >> word){      text.push_back(word);}


容器中的值是没有命名的,可以按vector中对象的位置来访问他们。vector的下标操作类似于string类型的下标操作。

for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)      ivec[ix] = 0;

下表操作不能添加元素,只能对确知已存在的元素进行下标操作。添加元素需要用push_back()操作。


迭代器(iterator),是除了利用下标访问vector对象外的另一种访问元素的方法。迭代器是一种检查容器内元素并遍历元素的数据类型。

vector<int>::iterator iter;

每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,有begin返回的迭代器指向第一个元素,由end操作返回的迭代器指向vector的“末端元素的下一个”。

vector<int>::iterator iter = ivec.begin();


个人理解:迭代器就像我们平时用的指针一样,iter代表存储地址,*iter代表地址里面存放的值,迭代器的递增变实现了容器对象的遍历。

for (vector<int>::iterator iter = ivec.begin; iter != ivec.end(); ++iter)      *iter = 0;  //利用迭代器遍历容器内的元素,并重新赋值为0


const_iterator 和iterator的用法几乎差不多,对于有些容器内的元素可能不希望对他进行修改,也为了避免误操作对它进行修改,因为我们用const_iterator,当我们用这种迭代器的时候,我们只能读容器内元素的值,而不能进行修改。

因此:

for (vector<int>::const_iterator iter = ivec.begin; iter != ivec.end(); ++iter)      *iter = 0;  
该段代码便是错误的写法。

但是:

for (vector<int>::iterator iter = ivec.begin; iter != ivec.end(); ++iter)      cout <<  *iter <<endl;
是正确的代码,因为我们只是读了容器内的值,而没有进行元素值的修改。


标准库bitset类型

#include<bitset>using std::bitset

bitset类也是一种类模板,在定义bitset时要明确bitset含有多少位。

bitset有多种构造函数:

bitset<8> s;    构造值为 00000000bitset<8> l(s);  构造值为 00000000string s("1101");bitset<8> l(s);  构造值为00001101string s("111111100000");bitset<8> l(s,5,4); 构造值为00001100

对于bitset对象上的操作有很多种定义方法:

b.any()  b中是否存在置为1的二进制位。

b.set()  把b中所有二进制位都置为1.

等等。。。






















原创粉丝点击