1. 程式人生 > >結構體中運算子的過載

結構體中運算子的過載

C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。 比如二分查詢,binary_crearch只能對陣列進行查詢,如果是結構體陣列的話,它會報錯。但很可惜,實際程式設計中,大部分時候操作物件是結構體陣列。 二分查詢結構體陣列的程式如下: [cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <stdio.h>  
  3. #include <algorithm>  
  4.   
  5. using namespace std;  
  6.   
  7. struct
     point  
  8. {  
  9.     int elem;  
  10.     bool operator==(const point b) const  
  11.     {  
  12.         return 
    this->elem == b.elem;  
  13.     }  
  14.     bool operator!=(const point b) const  
  15.     {  
  16.         return this->elem != b.elem;  
  17.     }  
  18.     bool operator<=(const point b) const  
  19.     {  
  20.         return this->elem <= b.elem;  
  21.     }  
  22.     bool operator<(const point b) const  
  23.     {  
  24.         return this->elem < b.elem;  
  25.     }  
  26.     bool operator>=(const point b) const  
  27.     {  
  28.         return this->elem >= b.elem;  
  29.     }  
  30.     bool operator>(const point b) const  
  31.     {  
  32.         return this->elem > b.elem;  
  33.     }  
  34. }a[10002],now;  
  35.   
  36. int main()  
  37. {  
  38.     bool flag;  
  39.     int i, n, k;  
  40.     scanf("%d", &n);  
  41.     for (i = 0; i <= n - 1; i++)  
  42.     {  
  43.         scanf("%d", &a[i].elem);  
  44.     }  
  45.     scanf("%d", &k);  
  46.     for (i = 0; i <= k - 1; i++)  
  47.     {  
  48.         scanf("%d", &now.elem);  
  49.         flag = binary_search(a, a + n , now);  
  50.         if (flag == true)  
  51.         {  
  52.             printf("Yes\n");  
  53.         }  
  54.         else  
  55.         {  
  56.             printf("No\n");  
  57.         }  
  58.     }  
  59.     return 0;  
  60. }  
a是結構體陣列,裡面包含元素elem,我們想按elem的值進行二分查詢。 過載運算子的格式如下: bool operator 運算子 (const 結構體名稱 b) const {
    return(什麼時候這個運算子對結構體成立);//注意對此運算子使用this->元素名; } 並要注意binary_search的第三個引數也要寫成結構體。 這樣就可以順利實現結構體陣列的二分查找了。
過載的時候,如果你不知道STL內部使用了哪些運算子,就最好把上面六種運算子全部過載了,當讓,如果你知道了STL的內部執行原理,也可以只過載它內部使用了的運算子,或者只過載你想要改變的運算子。 比如優先佇列程式: [cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <stdio.h>  
  3. #include <math.h>  
  4. #include <string.h>  
  5. #include <queue>  
  6.   
  7. using namespace std;  
  8.   
  9. struct point  
  10. {  
  11.     unsigned long long elem;  
  12.     bool operator<(const point b)const  
  13.     {  
  14.         return this->elem>b.elem;  
  15.     }  
  16. };  
  17.   
  18. priority_queue <point> q;  
  19. point create, now;  
  20.   
  21. int n;  
  22.   
  23. void clearqueue()  
  24. {  
  25.     while (!q.empty())  
  26.     {  
  27.         q.pop();  
  28.     }  
  29.     return;  
  30. }  
  31.   
  32. int main()  
  33. {  
  34.     while (1)  
  35.     {  
  36.         scanf("%d", &n);  
  37.         clearqueue();  
  38.         if (n == 0)  
  39.         {  
  40.             break;  
  41.         }  
  42.         now.elem = 1;  
  43.         q.push(now);  
  44.         while (!q.empty())  
  45.         {  
  46.             now = q.top();  
  47.             if (now.elem%n == 0)  
  48.             {  
  49.                 break;  
  50.             }  
  51.             else  
  52.             {  
  53.                 q.pop();  
  54.                 create.elem = now.elem * 10;  
  55.                 q.push(create);  
  56.                 if (now.elem % 10 == 0)  
  57.                 {  
  58.                     create.elem = now.elem + 1;  
  59.                     q.push(create);  
  60.                 }  
  61.             }  
  62.         }  
  63.         printf("%lld\n", now);  
  64.     }  
  65.     return 0;  
  66. }  
我只想讓小的元素處於佇列頂端,那麼就可以只改變<的判斷方式,其他不改變,那麼就只過載了小於。 又比如,六數碼問題中,判斷達到目標的條件是結構體的六個元素分別相等。但結構體不能直接寫“==”號,於是有 [cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <stdio.h>  
  3. #include <queue>  
  4. #include <string.h>  
  5.   
  6. using namespace std;  
  7.   
  8. struct state  
  9. {  
  10.     int a, b, c, d, e, f;  
  11.     bool operator==(const state t)const  
  12.     {  
  13.         return(this->a == t.a&&this->b == t.b&&this->c == t.c&&this->d == t.d&&this->e == t.e&&this->f == t.f);  
  14.     }  
  15. }s, now, temp, t;  
  16.   
  17. bool vis[6][6][6][6][6][6];  
  18. queue<state> q;  
  19.   
  20. state alpha(state s)  
  21. {  
  22.     int t;  
  23.     t = s.a;  
  24.     s.a = s.d;  
  25.     s.d = s.e;  
  26.     s.e = s.b;  
  27.     s.b = t;  
  28.     return s;  
  29. }  
  30.   
  31. state beita(state s)  
  32. {  
  33.     int t;  
  34.     t = s.b;  
  35.     s.b = s.e;  
  36.     s.e = s.f;  
  37.     s.f = s.c;  
  38.     s.c = t;  
  39.     return s;  
  40. }  
  41.   
  42. void clearqueue()  
  43. {  
  44.     while (!q.empty())  
  45.     {  
  46.         q.pop();  
  47.     }  
  48.     return;  
  49. }  
  50.   
  51. int main()  
  52. {  
  53.     int a, b, c, d, e, f, flag;  
  54.     t.a = 1;  
  55. 相關推薦

    結構運算子過載

    C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。 比如二分查詢,binary_crearch只能對陣列進行查詢,如果是結構

    在C語言結構添加成員函數

    我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

    c語言的特殊符號(結構

    結合 特殊 value -s height 間接尋址 出現 span size  在“結構”中出現的->運算符成為“右箭頭選擇”,可以用new_node->value = 10;來代替(*new_code).value = 10;即運算符->是運算符*和運

    golang 結構的匿名接口

    imp -i pil win CA git Go mean others golang 結構體中的匿名接口 代碼示例 golang 中,可以給結構體增加匿名field,可參考 unknwon 大神的書。 匿名字段和內嵌結構體 但,golang同時也可以給結構體定義一個匿名i

    C語言中free()函數釋放struct結構的規律

    void poi inf clu main 圖片 刪除 動態分配 不同 並不是什麽新鮮的事情,不過值得註意。首先我們知道,在使用struct來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間

    OpencvMat結構元素的獲取與賦值

    【OpenCV3影象處理】Mat中元素的獲取與賦值 ( 對比.at<>()函式 和 .ptr<>()函式) 2017年04月12日 10:08:55 閱讀數:7542 標籤: opencvopencv3 更多 個人分類:&nbs

    C語言結構冒號(位域)用法

    位域出現的原因是由於某些資訊的儲存表示只需要幾個bit位就可以表示而不需要一個完整的位元組,同時也是為了節省儲存空間和方便處理。   typedef struct  bit_struct {     int &n

    C++組合(聚合)與C結構包含函式

    C++組合(聚合)與C結構體中包含函式 今天突然想到C++的聚合,以前一直沒有注意,今天想到就寫下來,做個筆記; C++的類與我們的C語言中的結構體特別像,但是有有些不太一樣,這裡不多累贅了不能,大家學過的都知道。 C++組合(聚合) 我們知道的都是C++的類的物件,

    結構的指標,用malloc初始化時,沒有分配足夠的記憶體空間,造成下述錯誤

          對結構體中的指標,初始化和釋放,遇到堆損壞問題(附連結點選開啟連結)點選開啟連結) out_defect.texturing = (TEXTURING *)malloc(sizeof(TEXTURING

    結構使用函式指標

     struct kobj _ type  {  void (*release)(struct kobject *);  struct sysfs _ ops * sysfs _ ops;  struct attribute ** default _

    C++:對結構字元陣列賦值時,出現表示式必須是可修改的左值的問題

    問題描述:         在C++中為結構體中的字元陣列賦值時,出現”表示式必須是可修改的左值“的錯誤提醒,編譯報錯“不可指定資料型別”。           &n

    結構定義變數時,出現冒號+數字的形式(位域定義)

    該種形式出現於結構體或共用體的定義中,是位域定義的標準形式。其使用方式為struct name{type var_name : n;};含義為,在結構體name彙總,成員變數var_name佔用空間為n位。n為正整數,其值必須小於type型別佔用的位數。比如type如果是int,佔4位元組32位,那麼n必須是

    PE檔案可選頭結構的校驗和

    Windows作業系統中的驅動和一些系統dll檔案都是有校驗和的,而且Windows系統在載入時實惠檢查校驗和有沒有發生變化,發生變化,說明檔案已經被修改過(沒有變化,檔案可能沒有修改過;也可能檔案修改後,重新計算了校驗和,填寫到指定位置)肯定不會繼續載入。CheckSumMappedFile( )

    結構的位欄位

    z指定的位數決定了結構體變數d的大小,當z:29時,佔用4個位元組,共32位;當z:32時,需要使用8個位元組,佔用35位,自動補齊。一個int型佔用4個位元組。 #include <iostream> #include <stdio.h> usi

    當函式使用結構指標變數作為引數時,如果結構嵌套了結構,應該如何呼叫其中的元素?

    今天寫程式碼時突然遇到了這個問題,以前不曾探討過多層巢狀結構體指標變數的訪問,只知道結構體指標變數要訪問其元素時應該用 -> 來訪問,但對於結構體中巢狀有結構體的時候呢? 請看下面程式碼: #include “stdio.h” using namespac

    結構包含二級指標案例

    給出如下結構體,要求全部在堆區開闢空間。有多個老師,每個老師有多個學生。 typedef struct { char *name;//老師 int stu_num;//學生數 char **stu_arr;//學生名字 }TEACHER; 需要注意以下問題: 此問題使用雙層迴

    用指標指向結構的某一個元素的方法

    #include <stdio.h> struct St_Test{ int t1; int t2; int t3; int t4; }; void main() { struct St_Test St_Test_Ex; str

    結構函式指標初始化

    /** * 為結構體中的指標陣列賦值 */ #include <stdio.h> typedef struct test { void (*p)(void); void (*q)(void); void (*y)(void); }t

    如何給結構的字元陣列賦值。

    舉例如下: char a[10]; 1、定義的時候直接用字串賦值 char a[10]="hello"; 注意:不能先定義再給它賦值,如 char a[10]; a[10]="hello"; 這樣是錯誤的! 2、對陣列中字元逐個賦值 char a[10]={'h','e',

    c結構的 柔性陣列

    開發C程式碼時,經常見到如下型別的結構體定義: 1 2 3 4 5 typedef struct list_t{ struct list_t *next; struct list_t *prev; char data[0]; }l