一、過載運算子:
2、知識再梳理:
首先,過載運算子一般有兩種形式:第一種用成員函式的形式過載,第二種友元形式過載。
友元過載一般比成員函式過載要多乙個引數,成員函式過載會通過this指標隱式傳遞物件本身的引數。。。
(一)其中,必須要用友元來過載的有:
①、輸入輸出流過載;
基本格式:
friend ostream & operator <<(ostream & output,time & obj);
friend istream & operator >>(istream & input,time & obj);
//最後的返回值為:return output; or return input;
其次,我們一般不在過載函式所輸出的內容後面新增多餘的空格或者換行,例如:
ostream & operator <<(ostream &output,time & obj)
比如在vector中,我們通過過載[ ]來實現用下標來對容器內元素進行訪問的功能,不過目前,過載[ ]還不是很常用,因為大多數情況下過載都已經被封裝好了。
基本形式:
#include using namespace std ;
class f
;double f :: operator ( ) ( double x , double y )
int main ( )
這就相當於寫了乙個求距離的函式,只不過原來的函式名變成了類名,原來通過使用函式名的方式呼叫普通函式對形參做運算,現在直接呼叫物件的成員函式來進行運算。
另外,更常用的是,過載()給我們提供了一種自定義排序準則的方法,比如說stl中的map容器,有一種定義形式為:
mapm1;
其中op為帶有排序準則的 類(名) ;
具體如下(**可能不完整,只是舉例說明怎麼使用):
struct op
};
③、=(目前還沒怎麼用過);
time operator =(const int &x)
(三)還有即可用友元過載,又可以成員函式過載的例如比較運算(<、>,==......),還有++、--(注意前加與後加的不同:
)等等。
目前比較常用的像過載<,其主要作用感覺還是為自定義排序規則服務;
具體形式例如時間類中(time類中,用成員函式形式過載):
bool operator <(const time &obj )const
{ return year!=obj.year?year
過去我們儲存資訊都是通過普通陣列來實現,但其有一定的侷限性,比如當資料量非常大時,查詢或是刪除等操作會變的很複雜且時間複雜度較高,所以c++在編寫的時候為我們封裝好了一些較實用的容器,例如queue、stack、multimap、vector等等。
下面總結目前幾個經常使用的:
1、vector(動態陣列):
目前所寫的系統中,vector主要用於按原始順序儲存資訊,主要操作有:
①、v.size()返回當前v中元素個數;
②、v.push_back(i),將i新增到v的尾部;
③、v.erase(pos),刪除迭代器pos所指向的元素;
④、注意:vector v,是定義了乙個向量,而vector v[10010]則是定義了乙個向量陣列,其中每乙個元素都是乙個單獨的「陣列」。
還有幾個操作的易錯點可以看一下下面這個程式及注釋。。。
#includeusing namespace std;
vector v;
vector ::iterator it;//iterator有讀寫兩種功能、const_iterator唯讀;
int k=0;
int main()
{ //for(int i=0;i<=6;++i)v[i]=i; //該種方法無法給vector賦值,因為此時v的空間大小不確定;
//for(it =v.begin();itv2;
v2.assign(v.begin(),v.end());//不用考慮capacity的大小?好像不用;
for(it =v2.begin();it2、multimap;
multimap常用作vector中儲存內容的索引(元素的第二部分通常是其在vector中的位置),其最大的特點是可以根據元素的鍵值對元素進行自動排序,並且可以儲存多個鍵值相同的元素。
常用操作:(以atm使用者操作類中物件陣列的操作為例)
①、新增元素:
m1.insert(make_pair(string,int));//string 為對應訪問錢型別,int為其在vector中位置;
②、刪除單個元素:
m1.erase(pos);//pos為迭代器;
m.lower_bound( key ):返回鍵值》=key的第乙個元素位置;
m.upper_bound( key ):返回鍵值》key的第乙個元素的位置;
特別注意它們的返回值是multimap型別的迭代器。
兩者組合常用作查詢對應鍵值的元素(比如查詢所有存錢的資訊並輸出):
multimap < string,int > m1;
multimap < string,int >::iterator mit1;//map幾乎所有操作都和迭代器有關;
for(mit1=lower_bound("cq");mit1!=upper_bound("cq");++mit1)
cout1°:multimap中沒有過載[ ],因此不能像map、vector一樣通過「v[i],map[i]」的形式訪問元素;
2°:如果要自定義排序準則,比如使用multimap < string,int,op > m1;的形式定義,一定注意op是類名,而不是函式名。
3、queue(先進先出、佇列):
前段時間學習bfs時經常使用。。。
常用操作:
①、隊尾新增元素:q.push(x);
②、隊首刪除元素:q.pop( );
③、佇列是否為空:q.empty( );
④、取隊首元素:q.front( );
⑤、補充優先佇列(自動排序):
priority_queue ,less> q;//從大到小排列
priority_queue ,greater> q;//從小到大排列
當然如果要排序的元素是複雜資料型別的話,就要用到過載了。。。
首先,從前面學習的遞迴、函式、類,再到現在的stl、過載,很容易發現它們都有乙個或幾個共同的特點,那就是使用它們能夠使我們的程式更高效,可讀性更強,所以就目前水平來說,「更好的程式」可以理解為就是執行速度更快,**更簡潔明瞭的程式。
其次,對於過載來說,現階段自己掌握的僅僅是使用過載對應運算子的模板(固定格式),但對於其中很多本質的東西,自己並不明白,例如在過載語句中,我們發現有多處使用了 「&」、「const」等符號或關鍵字,但這些東西為什麼要加,不加對功能實現有沒有影響,有影響的話又會有什麼樣的影響,對於這些問題,自己都不是特別的明白,當然,這也反映出自己的水平太low,確實在將來還有很多知識需要學習。
最後,對於stl,目前來說只要會使用就可以了,上述自己不明白的那些語法細節可以暫時忽略,但對於各種容器及各種操作的「函式原型」我們還是要大概了解一下的,因為只用這樣我們才能知道哪個位置該用哪種型別的資料,例如常用的v.erase( pos),括號中的部分應當是對應的迭代器,而不是所要刪除的內容或者鍵值之類的,再如multimap中大部分的操作函式的返回值都是迭代器型別,因此我們在定義容器的同時也要為其定義乙個對應型別的迭代器,然後通過迭代器和各種函式的組合使用來實現我們想要的功能。
STL 過載運算子
過載運算子 為什麼要過載運算子 c 中預定義的運算子的操作物件只能是基本資料型別。但實際上,對於許多使用者自定義型別 例如結構體 也需要類似的運算操作。這時就必須在c 中重新定義這些運算子,賦予已有運算子新的功能,使它能夠用於特定型別執行特定的操作。運算子過載的實質是函式過載,它提供了c 的可擴充套...
過載運算子與STL總結
運算子過載 1.用成員函式過載運算子 class x 例如 過載 使複數相加 include using namespace std class complex 複數類 定義初始化表初始化complex類 complex double r,double i real r imag i 宣告成員函式,...
過載運算子總結
基本知識點 不可過載的算符 sizeof 可過載的運算子 等 過載運算子的限制 不改變運算子的優先順序 不改變運算子的結合性 不改變運算子所需要的運算元 不能改變新的運算子 可對運算子作出新的解釋,原有的基本語義不變 運算子函式可過載為成員函式和友元函式 一元運算子 過載成員函式 object.op...