C++Primer 标准库类型

来源:互联网 发布:ge端口 编辑:程序博客网 时间:2024/04/30 11:43

1.抽象数据类型ADT:使用标准库定义的抽象数据类型时不关心它们如何表示,只需要知道它们支持什么操作。

2.using声明:命名空间的说明

#include <iostream>#include <string>using std::cin;using std::cout;using std::string;

3.标准库string类型:支持长度可变对的字符串。

(1)定义和初始化:初始化类需要用构造函数。

string s1;  //默认构造函数,s1是空串string s2(s1);string s3("value");string s4(n,'c');

(2)对象读写:读取并忽略开头所有的空白字符,再次遇到空白字符读取终止。输入"    Hello World!  ",输出是 "Hello"。除非已知string对象中单词的数目,分别定义两个string对象,输出为"HelloWorld!"

(3)未知数目的string对象:

string word;while(cin>>word)   cout<<word<<" ";

(4)getline读取全部文本:读取整行数据直到换行符出现为止,getline停止读入并返回。

string line;while(getline(cin,line))cout<<line<<endl;

(5)string对象的操作

   size操作:s.size()返回的是标准库类型string::size_type,而不是int型。

   string对象的大小:大写字母位于小写字母之前,位置越靠后的字母越大。比较string对象的第一个不匹配的字符,来判断string对象的大小。若长度不同,且短的部分和长的前半部分相同,则长的string对象更大。

   string对象的相加:若是两个string直接连接就好。若其中一方为字符串字面值,也可以直接连接。但不允许+两边都是字符串字面值

   string取字符:下标从0开始。而且[]中必须是一个string::size_type类型的值。

 

(6)对string中字符的处理 :函数均定义在cctype头文件中。

string  s("Hello World!!!");string::size_type punct_cnt = 0;for(string::size_type index = 0;index!=s.size();++index){if(ispunct(s[index]))    ++punct_cnt;s[index] = tolower(s[index]);}cout<<punct_cnt<<" punctuation charactors in " << s <<endl;


4.标准库vector类型

(1)vector的概念

     vector是同一种类型的对象的集合,称为容器,因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。vector是一个类模板class template,而不是一种数据类型。只有当vector指定了保存哪种类型的对象,vector<int>,vector<string>才是数据类型。

(2)vector定义和初始化

     虽然可以给给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态的增加元素。

(3)vector操作

     v.size():返回值是vector<T>::size_type 

     v.push_back():在v的末尾增加一个值为t的元素。

string word;vector<string> text;while(cin>>word)text.push_back(word);for(vector<string>::size_type ix = 0; ix!=text.size();++ix)cout<<text[ix]<<" ";cout<<endl;
 

只能对已经存在的vector元素使用下表操作。因此不能用下标操作去添加元素,而要用push_back。


5.迭代器iterator:一种检查容器内元素并遍历元素的数据类型。标准库对所有容器都定义了一种迭代器类型,提供了除了下标操作之外更通用的元素访问的方法。

(1)容器的iterator类型:各个容器都定义了各自的名为iterator的成员

vector<int>::iterator iter;

(2)迭代器的操作:若vector不是空,则v.begin()返回的迭代器指向容器v中的第一个值v[0],而v.end()返回的迭代器指向末尾元素的下一个。若vector是空,则begin和end返回的迭代器相同。

(3)迭代器可以使用解引用操作符来访问其指向的元素。这里使用下标操作,即使容器是空也安全,因为在ix!=ivec.size()时循环就停止了。

for(vector<int>::iterator iter = ivec.begin(); iter!=ivec.end();++iter;)*iter = 0;
(4)const_iterator:只能读取容器内的元素,迭代器本身可以自增和读取,但不能改变其指向元素的值。

     const vector<T>::iterator: const的迭代器,必须初始化,并不能改变指向。     

(5)迭代器算数操作:

     iter+n,iter-n: 加减的值必须是该vector的size_type或者difference_type类型。

     iter1-iter2:两个迭代器的距离也是difference_type的signed类型。


6.标准库bitset类型

(1)定义和初始化:bitset也是类模板,需要指定含有多少位。bitset输出位数从左到右为32位,31位....0位。string最右的字符即下标最大的字符用来初始化bitset对象的最低位。可以直接输出bitvec输出二进制位。

    bitset<32> bitvec:均初始化为0。

    bitset<16> bitvec1(0xffff):1111 1111 1111 1111。

    bitset<32> bitvec2(0xffff): 0000 0000 0000 00001111 1111 1111 1111

    string straval("1100");bitset<16> bitvec3(straval): 0000 0000 0000 1100。

    string str("1111 1110 0000 0011 0110 1");bitset<16> bitvec4(str,5,4): 1100。


(2)测试对象:count返回的是size_t的类型,定义在cstddef头文件中。

bool is_set = bitvec.any();size_t bits_set = bitvec.count();size_t sz = bitvec.size();

 (3)访问对象位:可以下标访问,也可以用set,test,reset来设置对象的值。

(4)对整个对象:bitvec.reset();bitvec.flip();

(5)获取对象的值:当bitset类型的长度小于或等于unsigned long的长度,即小于或等于32位时,可以使用to_long操作。

unsigned long ulong = bitvec.to_ulong();cout<<"ulong =  "<<ulong<<endl;




0 0