第八章 標準模板庫STL(一)

2022-07-13 15:48:12 字數 3526 閱讀 1973

目錄函式物件

less和greater函式物件

原型:typedef basic_stringstring;

常見操作

//初始化

string s1("hello world!"),s2="test",s3(8,'x'),s4; //代表8個x組成的字串

s4='c';

//定位&賦值

s1[1]='a';s1.at(1)='b'; //at成員函式速度較慢,但會進行範圍檢查,陣列越界訪問會丟擲異常out_of_range

s1.assign(s2); //等價於s1=s2;

s1.assign(s2,1,3); //將s2從下標1開始的3個字元賦給s1

//連線

s1+=s2;

//比較大小:可直接用》,>=,<,<=,==,!=,或

bool b=s1.compare(s2);

bool b=s1.compare(0,2,s2);

bool b=s1.compare(0,2,s2,1,2); //將s1下標0開始的2個字元與s2從下標1開始的2個字元比較

//交換s1和s2

s1.swap(s2);

//子串

s2=s1.substr(0,3); //起始下標0,長度3

//替換和插入

s1.replace(1,3,s2); //s1下標1後3位字元替換成s2

s1.replace(1,3,s2,0,5); //s1下標1後3位字元替換成s2下標0後的5位字元

s1.insert(2,s2); //下標2處插入s2

s1.insert(2,s2,0,5); //s2起始下標0,長度5

//刪除

s1.erase(5); //刪除下標5後面的全部字元

//查詢

s1.find("lo"); //查詢第乙個「lo"字串起始下標,識別失敗返回string::npos

s1.find("lo",3); //從下標3開始查詢

s1.rfind("lo"); //反向查詢

s1.find_first_of("abcd"); //從頭查詢第一次出現abcd任一字元的下標

s1.find_last_of("abcd"); //查詢最後乙個

s1.find_first_not_of("abcd");

s1.find_last_not_of("abcd");

//獲取char*型指標,修改string可能會導致指標p出錯

const char *p=s1.c_str;

const char *p=s1.data();

字串流處理(需要加sstream標頭檔案)

istringsteam input("this test 3.5 a"); 

string s1,s2; double d; char ch;

input>>s1>>s2>>d>>ch;

ostringstream output;

output<

基本概念

容器:可容納各種資料型別的通用結構 ,是類模板

迭代器:可用於依次訪問容器中元素,類似指標

演算法:用來操作容器中元素的函式模板

型別順序容器:無序,可在任意位置插入元素

關聯容器:有序,增刪元素自動排序,查詢效能佳

容器介面卡

成員函式

順序容器和關聯容器都有的成員函式:begin(), end(), rbegin(), rend(), erase(), clear()

順序容器的常用成員函式:front(), back(), push_back(), pop_back(), erase()

迭代器類似指標,分const和非const兩種,非const型可以修改其指向的元素

容器類名::iterator 變數名

容器類名::const_iterator 變數名

分雙向迭代器和隨機迭代器

在模板中寫迭代器時,最好在前面加上 typename關鍵字,否則可能會編譯錯。vs可能無此問題,但是dev c++和伺服器上的編譯環境會有這個問題,比如:

typename list::iterator i; //typename用於指明list::iterator是個型別

演算法(函式模板)

find順序查詢

templateit find(it first,it last,const t& val); 

//用==判斷相等,找不到則返回last指標

bianry_search二元查詢,僅適用於由小到大排好序的順序容器,找到返回true,否則false,用《判斷

vector

示例

int a=;

vectorv(a,a+5); //拷貝整個陣列

coutv2.insert(v2.begin(),v.begin()+1,v.begin()+3); //v2[0]插入v區間

v.erase(v.begin()+1,v.begin()+3); //刪除區間

deque

支援vector所有操作,且支援push_front和pop_front操作隊首元素 o(1)

list

支援順序容器所有操作

其他操作

listlst(a,a+5); //拷貝整個陣列

push_front(t val);

pop_front();

sort(); //排序,不支援stl的排序函式

sort(t op); //按照某種規則排序

remove(t val); //刪除指定值的元素

unique(); //刪除所有和前乙個元素相等的元素(若去重,需要先sort)

merge(listlst); //與lst鍊錶合併,並清空lst

reverse(); //顛倒鍊錶

splice(it p1,listlst2,it p2,it p3);//將lst2的[p2,p3)移動到p1前面

在類中對括號進行過載,使類物件具有類似函式的功能

目的:增強函式復用性,不用針對每種情況編寫乙個函式

templateclass sumpower

t operator() (const t& init,const t& tmp)

int main();

vectorv(a,a+10);

cout<<"立方和: "<(3));

return 0;

}

less()按照從小到大的方式排列

greater()按照從大到小的方式排列

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

第八章 IO庫

由於不能拷貝 io 物件,因此我們也不能將形參或返回型別設定為流型別。進行 io 操作的函式通常以引用方式傳遞和返回流。讀寫乙個 io 物件會改變其狀態,因此傳遞和返回的引用不能是 const 導致緩衝區重新整理 即,資料真正寫到輸出裝置或檔案 的原因 程式正常結束,作為 main 函式的 retu...

第八章 IO庫

表8.1是標準庫中的這些io型別和標頭檔案 為支援寬字元語言,標準庫定義的io類也可操縱wchar t型別資料,它對應的型別和函式名以w開始 裝置型別和字元寬度不會影響io操作,例如 運算子對控制台視窗 檔案 字串都可用,對char和wchar t也可用 通過繼承,標準庫可忽略這些不同裝置和不同字元...