【C++ Primer學習筆記】第3章:標準庫類型

除第2章介紹的基本數據類型外,C++還定義了一個內容豐富的抽象數據類型標準庫。ios


3.1命名空間的using聲明程序員

在編譯咱們提供的實例程序前,讀者必定要注意在程序中添加適當的#include和using說明。編程

有一種狀況下,必須老是使用徹底限定的標準庫名字:在頭文件中數組


3.2標準庫string類型安全

編程時必定要注意區分字符串字面值和string數據類型的使用。spa

string類型輸入:讀取並忽略開頭全部空白字符,直至再次遇到空白字符讀取終止。指針

getline:接受兩個參數,一個輸入流對象和一個string對象,從輸入流下一行讀取,遇到換行符終止並丟棄換行符。code

任何存儲string的size操做結果的變量必須爲string::size_type類型。不要把size返回值賦給int變量。orm

爲避免溢出,保存一個string對象size最安全的方法是使用標準庫類型string::size_type。對象

當進行string對象和字符串字面值混合鏈接時,+操做符的左右操做數必須至少一個是string類型。

下標操做符須要取一個size_type類型的值,來標明要訪問字符的位置。

C++程序員應採用cname這種頭文件版本,而不是name.h版本,這樣標準庫中的名字在命名空間std中保持一致。使用.h版本會給程序員帶來負擔,由於他們必須記得哪些標準庫名字是從C繼承過來的,哪些是C++所特有的。


3.3標準庫vector類型

vector是同一種類型的對象的集合,每一個對象都有一個對應的整數索引值。

定義vector對象要指定類型和一個變量的列表。

雖然能夠對給定元素個數的vector對象預先分配內存,可是更有效的方法是先初始化一個空的vector對象,而後再動態的增長元素。

push_back()操做接受一個元素值,並將它做爲一個新的元素添加到vector對象的後面。

C++程序員習慣於優先使用!=而不是<來編寫循環判斷條件。


3.4迭代器簡介

迭代器是一種檢查容器內元素並遍歷元素的數據類型。

每一個標準容器類型都定義了一個名爲iterator的成員,這裏的iterator與迭代器實際類型的含義相同,這種類型支持迭代器的各類操做。

end操做返回的迭代器不指向任何元素。

不要把const_iterator對象和const的iterator對象混淆。

迭代器加上或者減去的值應該是vector的size_type或者difference_type類型。


3.5標準庫bitset類型

定義bitset時,要明確bieset含有多少位,須在尖括號中給出它的長度值。

string對象的最右面字符用來初始化bitset對象低階位。

count操做的返回類型是標準庫中命名爲size_t的類型。size_t定義在cstddef頭文件中。

相對於C++內置數據的數組和指針而言,程序員應優先使用標準庫類類型。


習題3.5 從標準輸入每次讀入一行文本

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string line;
	while(getline(cin,line))
	  cout<<line<<endl;
	return 0;
}


習題3.8 從標準輸入讀入多個string對象並鏈接起來,鏈接後對象以空格隔開

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string sumstr,str;
	cout<<"Enter strings(Ctrl+Z to end):"<<endl;
	while(cin>>str)
	  sumstr=sumstr+' '+str;
    cout<<"string equal to the concatenation of these strings is:"
        <<endl<<sumstr<<endl;
    return 0;
}


習題3.10

#include<iostream>
#include<string>
#include<cctype>
using namespace std;

int main()
{
	string str,xstr;
	bool has_punct=false;
	char ch;
	
	cout<<"Enter a string:"<<endl;
	getline(cin,str);
	for(string::size_type index=0;index!=str.size();index++)
	{
		ch=str[index];
		if(ispunct(ch))
		  has_punct=true;
        else xstr+=ch;
	}
	if(has_punct)
	  cout<<"result:"<<endl<<xstr<<endl;
	else {cout<<"No pounctuation character in the string?!"<<endl;
	     return -1; 
	}
	return 0;
}


習題3.14

#include<iostream>
#include<string>
#include<vector>
#include<cctype>
using namespace std;

int main()
{
	vector<string> svec;
	string str;
	
	cout<<"Enter text(Ctrl+Z to end):"<<endl;
	while(cin>>str)
	  svec.push_back(str);
	  
    cout<<"Transformed elements from the vector:"<<endl;
    for(vector<string>::size_type ix=0;ix!=svec.size();++ix)
    {
    	for(string::size_type index=0;index!=svec[ix].size();++index)
    	  if(islower(svec[ix][index]))
    	  svec[ix][index]=toupper(svec[ix][index]);
  	    cout<<svec[ix]<<" ";
  	    if((ix+1)%8==0)cout<<endl;
    }
    return 0;
}

相關文章
相關標籤/搜索