運算符重載和STL複習總結

不能重載的運算符包括   . ::  .*  ?:  sizeof

可重載的運算符包括  

-  * /  %  ^  &  |  ~

!  = <  >  +=  -=  *=  /=  %

^= &=  |=  <<  >>  >>= <<=  ==  !=

<= >=  &&  ||  ++  --  ->*  ‘ ->

[]  () new  delete  new[]  delete[]

  重載運算符函數是對運算符的功能進行增加,並且原有的語義不變。1不改變運算符的優先級,。2不改變運算符的結合性。3不改變運算符所需要的操作數。4不能創建新的運算符。

  運算符函數可以重載爲成員函數或友元函數。

一元運算符:Object op       op  Objectop爲運算符)

重載爲成員函數,解釋爲:Object .operator op ()  操作數由對象Object通過this指針隱含傳遞,因此參數表沒有參數。函數調用方式有兩種(1)op對象;(2)對象.operator op()。這兩種調用方式是等價的。

在類外的定義:返回類型 類名::operator op (形參表){}

重載爲友元函數,解釋爲:operatorop(Object)  操作數由參數表的參數Object提供。

在類外的定義:返回類型 operator op(形參表){}

二元運算符ObjectL  op ObjectR 兩個對象來操作

重載爲成員函數,解釋爲:ObjectL .operatorop ( ObjectR )  左操作數由ObjectL通過this指針傳遞,右操作數由參數ObjectR傳遞。函數有兩種調用方式(1)對象1op對象2;(2)對象1.operator op(對象2)這兩種調用方式也是等價的。

重載爲友元函數,解釋爲:operatorop (ObjectL, ObjectR )  左右操作數都由參數傳遞。

二元運算符在操作數類型不同時,必須使用友元類重載。

  友元函數重載運算符常用於運算符的左右操作數類型不同的情況,在第一個參數需要隱式轉換的情形下,使用友元函數重載運算符是正確的選擇。友元函數沒有 this指針,所需操作數都必須在參數表顯式聲明,很容易實現類型的隱式轉換。C++中不能用友元函數重載的運算符有   =   ()    []   >

  對於幾個常用的運算符++  --  =  []  ()  <<  >>

++--有前後兩種方式,後置或者前置中需要加上int虛參進行區分。

=必須重載爲成員函數。

運算符[]()是二元運算符。[]()=一樣,只能用成員函數重載,不能用友元函數重載。

<<>>只能重載爲友元函數,下面是類中和類外輸入輸出運算符的定義。

friend ostream& operator<<(ostream & os,const Date & p2);
friend istream & operator>>(istream & is,Date & p2);

ostream &operator<<(ostream & os,const Date & p2)
{
    os<<p2.month<<""<<p2.day<<" "<<p2.hour<<""<<p2.minute;
    return os;
}
istream & operator>>(istream & is,Date & p2)
{
    is>>p2.month;
    is>>p2.day;
    is>>p2.hour;
    is>>p2.minute;
    return is;
}

  STLC++標準程序庫的核心,深刻影響了標準程序庫的整體結構,由一些可適應不同需求的集合類(collection class,以及在這些數據集合上操作的算法(algorithm構成,內的所有組件都由模板(template構成,其元素可以是任意類型,是所有C++編譯器和所有操作系統平臺都支持的一種庫。STL可以用容器(Container)迭代器(Iterator)算法(Algorithm 三部分概括。

  容器的作用是管理某類對象的集合,容器又分爲兩類1是序列式容器(序列式容器元素的默認構造函數必須可用)2是關聯式容器(關聯式容器必須定義出排序準則,默認情況是重載operator <)。定義一個空的容器  std::list<int>l; 如果兩個容器進行比較的話兩個容器的類型必須相同。

  迭代器的作用是在對象集合上進行遍歷,指出容器中的一個特定位置,要注意的是end()操作是指向最後一個元素之後,而不是最後一個元素。所有容器都提供兩種迭代器container::iterator/模式遍歷元素;container::const_iterator只讀模式遍歷元素。迭代器分爲雙向迭代器隨機存取迭代器。

   算法的作用是處理集合內的元素。

向量vector

  vector的作用和數組類似,但是是動態數組,比數組更加方便,好用。vector的元素可以是任意類型T,但必須具備賦值和拷貝能力。使用vector必須使用頭文件#include<vector>vector的用法包括創建一個空的向量vector<T>cc.size()返回元素個數,c.push_back(e)在尾部添加一個元素e的副本。c.pop_back()移除最後一個元素但不返回最後一個元素。等等。

map/multimap:

用平衡二叉樹管理元素。元素包含兩部分(key,value)keyvalue可以是任意類型,必須包含的頭文件#include <map>,根據元素的key自動對元素排序,因此根據元素的key進行定位很快,但根據元素的value定位很慢,不能直接改變元素的key,可以通過operator []直接存取元素值,map中不允許key相同的元素,multimap允許key相同的元素。

產生一個空的mapmap map1; map<string,int>map1;用數組方式對map進行賦值: map1[“a”]=1; map1[“b”]=2;其中map可以是下列形式map<key,value> 一個以less<)爲排序準則的mapmap<key,value,op> 一個以op爲排序準則的mapmap的函數用法和vector差不多。但是mapcount(key) 返回鍵值等於key”的元素個數,find(key)返回鍵值等於key”的第一個元素,找不到返回end函數。這也使得map可以更加方便的在數據中找到需要查詢的數據。map還有lower_bound(key)返回鍵值大於等於key”的第一個元素,upper_bound(key) 返回鍵值大於key”的第一個元素,equal_range(key) 返回鍵值等於key”的元素區間。

set/multiset

  使用平衡二叉樹管理元素。集合(Set)是一種包含已排序對象的關聯容器。必須包含的頭文件#include <set>map容器是鍵-值對的集合,好比以人名爲鍵的地址和電話號碼。相反地,set容器只是單純的鍵的集合。當我們想知道某位用戶是否存在時,使用set容器是最合適的。set中不允許key相同的元素,multiset允許key相同的元素。set的函數用法和map類似

算法:

  所有算法的前兩個參數都是一對iterators:[firstlast),用來指出容器內一個範圍內的元素。大部分算法都可以用functioin object 來更改準則。算法中的幾個典型的函數1count:計算[first,last) 中等於val的元素個數。2count_if 計算[first,last) 中符合pr(e) == true 的元e的個數。3 min_element:  返回[first,last) 中最小元素的迭代器, < ”作比較器。max_element:返回[first,last) 中最大(不小)元素的迭代器, < ”作比較器。4  for_each[first,last)中的每個元素e,執行f(e),要求 f(e)不能改變e5  find返回區間 [first,last)中的迭代器 i ,使得 * i == val6  find_if返回區間 [first,last)中的迭代器 i,使得pr(*i)==true.7 binary_search 折半查找,要求容器已經有序且支持隨機訪問迭代器,返回是否找到.8lower_bound要求[first,last)是有序的,查找大於等於val的最小的位置. upper_bound要求[first,last)是有序的,查找大於val的最小位置.9 sort  快速排序.10 unique去除[first,last) 這個升序序列中重複元素返回值是迭代器,指向元素刪除後的區間的最後一個元素的後面。11reverse顛倒區間[first,last)順序。
  在進行了運算符重載和STL學習之後,對於代碼的編寫又多了許多新的方法,但是對於方法的增多,掌握的不是特別的好。對於運算符重載,就是對運算符進行功能的增加,使得代碼可以更加簡潔和更加容易閱讀。學習了STL對於一些操作確實變簡單了許多,但是對於STL,到現在我也是只是會用一點皮毛,對於大部分內容來說還不是太熟練,還需要多多的進行寫代碼的練習。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章