stl模板庫和運算子過載

2021-08-20 07:22:21 字數 4738 閱讀 9970

最近幾周我們學習了stl和運算子過載,從中受益很多,但還有很

多不懂的地方,不過我確實是學會了很多,從這幾周的學習中下

面是我的一些學習總結:

一 運算子過載

1.過載的限制

過載運算子函式可以對運算子做出新的解釋,但原有基本語義

不變:(1)不改變運算子的優先順序

(2)不改變運算子的結合性

(3)不改變運算子所需要的運算元

(4)不能建立新的運算子

2,用成員或友元函式過載運算子 :

(1)一元運算子:

object op    或    op object

過載為成員函式,解釋為:

object . operator op ()

運算元由物件object通過this指標隱含傳遞

過載為友元函式,解釋為:

operator op (object)

運算元由參數列的引數object提供

(2)二元運算子:

objectl op objectr

過載為成員函式,解釋為:

objectl . operator op ( objectr )

左運算元由objectl通過this指標傳遞,右運算元由引數objectr

傳遞過載為友元函式,解釋為:

operator op ( objectl, objectr )

左右運算元都由引數傳遞

例子:有乙個time類,包含資料成員minute(分)和sec(秒),模

擬秒錶,每次走一秒,滿60秒進一分鐘,此時秒又從0開始算。

要求輸出分和秒的值。

class time

time(intm,ints):minute(m),sec(s)

time

operator++( );     //

宣告前置自增運算子「

++」過載函式

time 

operator++(int);   //

宣告後置自增運算子「

++」過載函式

private:

intminute;

intsec;

};time time∷operator++( )    //定義前置自增運算子「++」過載函式

return*this;          //返回當前物件值

}time time∷operator++(int)  //定義後置自增運算子「++」過載函式

returntemp;

//返回的是自加前的物件

}注意:

1:成員運算子函式比友元運算子函式少帶乙個引數(後置的

++、--需要增加乙個形參)。

2: 雙目運算子一般可以被過載為友元運算子函式或成員運算子

函式,但當運算元型別不相同時,必須使用友元函式。

3:幾種特殊情況:

(1)運算子【】和()是二元運算子,只能用成員函式過載,

不能用友元函式過載。

(2)過載輸出(輸入)運算子只能用友元函式過載。

4:過載運算子[ ]和()

(1)過載下標運算子

運算子用於訪問資料物件的元素

過載格式:      型別  類 ::operator  ( 型別) ;

例設 x 是類 x 的乙個物件,則表示式

x[ y ]

可被解釋為

x. operator [ ] ( y )

(2)過載函式呼叫符 ()

() 運算子用於函式呼叫

過載格式:      型別  類 ::operator()  ( 參數列  );

例設 x 是類 x 的乙個物件,則表示式

x( arg1, arg2, … )

可被解釋為

x. operator () (arg1, arg2, … )

注意:運算子和()是二元運算子

和()只能用成員函式過載,不能用友元函式過載 

5.過載輸出輸入流

cin是 itream的物件,cout是ostream的物件

運算子 《由ostream過載為插入操作,用於輸出基本型別資料

運算子 >>由istream過載為提取操作,用於輸入基本型別資料

用友元函式過載《和》,輸出和輸入使用者自定義的資料型別

例如:istream&operator>>(istream&in,class_name&obj)

注意:只能被過載成友元函式,不能過載成成員函式

賦值運算子過載用於物件資料的複製

operator=必須過載為成員函式

二 stl模板庫

1:stl簡介

(1)stl是c++標準程式庫的核心,深刻影響了標準程式庫的

整體結構。

(2)stl由一些可適應不同需求的集合類(collection 

class),以及在這些資料集合上操作的演算法(algorithm)構成

(3)stl內的所有元件都由模板(template)構成,其元素可

以是任意型別。

(4)stl是所有c++編譯器和所有作業系統平台都支援的一種

庫。2:stl元件

容器(container

) - 管理某類物件的集合

迭代器(

iterator

) - 在物件集合上進行遍歷

演算法(algorithm

) - 處理集合內的元素

容器介面卡(

container adaptor

)函式物件

3:stl容器類別

(1)序列式容器——排列次序取決於時機和位置

(2)關聯式容器——排列順序取決於特定準則

4:迭代器

可遍歷stl容器內全部或部分元素的物件

指出容器中的乙個特定位置

5:容器

(1)vector

vector     為了使用vector,必須包含標頭檔案

vector模擬動態陣列

vector的元素可以是任意型別t,但必須具備賦值和拷貝能力

(具有public拷貝建構函式和過載的賦值操作符)

必須包含的標頭檔案#include

vector支援隨機訪問

vector的大小(size)和容量(capacity)

sie返回實際元素個數,

capacity返回vector能容納的元素最大數量。如果插入元素時,

元素個數超過capacity,需要重新配置內部儲存器

vec.begin()

//指向迭代器中第乙個元素。   

vec.end()//指向迭代器中末端元素的下乙個,指向乙個不存在元素。          

vec.push_back(elem)     //在尾部加入乙個資料。  

vec.pop_back()          //刪除最後乙個資料。  

vec.capacity()  //vector可用空間的大小。  

vec.size()//返回容器中資料個數。  

vec.empty() //判斷容器是否為空。  

vec.front()     //傳回第乙個資料。  

vec.back()  //傳回最後乙個資料,不檢查這個資料是否存在。  

vec.at(index)   //傳回索引idx所指的資料,如果idx越界,丟擲out_of_range。  

vec.clear() //移除容器中所有資料。  

vec.erase(iterator) //刪除pos位置的資料,傳回下乙個資料的位置。  

vec.erase(begin,end)    //刪除[beg,end)區間的資料,傳回下乙個資料的位置。注意:begin和end為iterator  

vec.insert(position,elem)   //在pos位置插入乙個elem拷貝,傳回新資料位置。  

vec.insert(position,n,elem) //在pos位置插入n個elem資料,無返回值。  

vec.insert(position,begin,end)  //在pos位置插入在[beg,end)區間的資料,無返回值。

(2)map/multimap

使用平衡二叉樹管理元素

元素包含兩部分(key,value),key和value可以是任意型別

必須包含的標頭檔案#include

根據元素的key自動對元素排序,因此根據元素的key進行定位

很快,但根據元素的value定位很慢

不能直接改變元素的key,可以通過operator 直接訪問元素值

map中不允許key相同的元素,multimap允許key相同的元素

(3)set/multiset

使用平衡二叉樹管理元素

集合(set)是一種包含已排序物件的關聯容器。

必須包含的標頭檔案#include

map容器是鍵-值對的集合,好比以人名為鍵的位址和**號

碼。相反地,set容器只是單純的鍵的集合。當我們想知道某位

使用者是否存在時,使用set容器是最合適的。

set中不允許key相同的元素,multiset允許key相同的元素

三 學習心得總結

這兩個知識點使**變得更加簡潔明瞭,在解決atm的問題上

有很大作用,讓我少了很多麻煩。例如:對"

了時間類的直接比較,用vector,map, multimap來儲存記

錄,實現查詢等功能。我感覺我還需繼續努力,學好這部分知

識!

運算子過載和STL

include using namespace std class printdata public void print int i void setlength double len void setbreadth double bre void setheight double hei 過載 ...

STL 過載運算子

過載運算子 為什麼要過載運算子 c 中預定義的運算子的操作物件只能是基本資料型別。但實際上,對於許多使用者自定義型別 例如結構體 也需要類似的運算操作。這時就必須在c 中重新定義這些運算子,賦予已有運算子新的功能,使它能夠用於特定型別執行特定的操作。運算子過載的實質是函式過載,它提供了c 的可擴充套...

運算子過載及STL總結

運算子過載 要點 什麼是運算子過載,其意義何在?以成員函式的形式進行過載 通過友元函式實現過載 過載 1.明確目標 為什麼要進行運算子過載?int x,y y x y 表示兩個整數相加,很簡潔。但是,兩個字串合併 char x 20 y 20 strcat x,y 表達起來就不如 y x y 那樣直...