C++Primer 標準庫類型

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 0000 1111 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;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章