C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。
比如二分查找,binary_crearch只能對數組進行查找,如果是結構體數組的話,它會報錯。但很可惜,實際編程中,大部分時候操作對象是結構體數組。
二分查找結構體數組的程序如下:
- #include <iostream>
- #include <stdio.h>
- #include <algorithm>
- using namespace std;
- struct point
- {
- int elem;
- bool operator==(const point b) const
- {
- return this->elem == b.elem;
- }
- bool operator!=(const point b) const
- {
- return this->elem != b.elem;
- }
- bool operator<=(const point b) const
- {
- return this->elem <= b.elem;
- }
- bool operator<(const point b) const
- {
- return this->elem < b.elem;
- }
- bool operator>=(const point b) const
- {
- return this->elem >= b.elem;
- }
- bool operator>(const point b) const
- {
- return this->elem > b.elem;
- }
- }a[10002],now;
- int main()
- {
- bool flag;
- int i, n, k;
- scanf("%d", &n);
- for (i = 0; i <= n - 1; i++)
- {
- scanf("%d", &a[i].elem);
- }
- scanf("%d", &k);
- for (i = 0; i <= k - 1; i++)
- {
- scanf("%d", &now.elem);
- flag = binary_search(a, a + n , now);
- if (flag == true)
- {
- printf("Yes\n");
- }
- else
- {
- printf("No\n");
- }
- }
- return 0;
- }
a是結構體數組,裏面包含元素elem,我們想按elem的值進行二分查找。
重載運算符的格式如下:
bool operator 運算符 (const 結構體名稱 b) const
{
return(什麼時候這個運算符對結構體成立);//注意對此運算符使用this->元素名;
return(什麼時候這個運算符對結構體成立);//注意對此運算符使用this->元素名;
}
並要注意binary_search的第三個參數也要寫成結構體。
這樣就可以順利實現結構體數組的二分查找了。
重載的時候,如果你不知道STL內部使用了哪些運算符,就最好把上面六種運算符全部重載了,當讓,如果你知道了STL的內部運行原理,也可以只重載它內部使用了的運算符,或者只重載你想要改變的運算符。
重載的時候,如果你不知道STL內部使用了哪些運算符,就最好把上面六種運算符全部重載了,當讓,如果你知道了STL的內部運行原理,也可以只重載它內部使用了的運算符,或者只重載你想要改變的運算符。
比如優先隊列程序:
- #include <iostream>
- #include <stdio.h>
- #include <math.h>
- #include <string.h>
- #include <queue>
- using namespace std;
- struct point
- {
- unsigned long long elem;
- bool operator<(const point b)const
- {
- return this->elem>b.elem;
- }
- };
- priority_queue <point> q;
- point create, now;
- int n;
- void clearqueue()
- {
- while (!q.empty())
- {
- q.pop();
- }
- return;
- }
- int main()
- {
- while (1)
- {
- scanf("%d", &n);
- clearqueue();
- if (n == 0)
- {
- break;
- }
- now.elem = 1;
- q.push(now);
- while (!q.empty())
- {
- now = q.top();
- if (now.elem%n == 0)
- {
- break;
- }
- else
- {
- q.pop();
- create.elem = now.elem * 10;
- q.push(create);
- if (now.elem % 10 == 0)
- {
- create.elem = now.elem + 1;
- q.push(create);
- }
- }
- }
- printf("%lld\n", now);
- }
- return 0;
- }
我只想讓小的元素處於隊列頂端,那麼就可以只改變<的判斷方式,其他不改變,那麼就只重載了小於。
又比如,六數碼問題中,判斷達到目標的條件是結構體的六個元素分別相等。但結構體不能直接寫“==”號,於是有
利用重載可以簡化代碼,和STL一起運用會產生很大的威力,並且最好了解STL內部的運行原理,以便能正確重載運算符。
- #include <iostream>
- #include <stdio.h>
- #include <queue>
- #include <string.h>
- using namespace std;
- struct state
- {
- int a, b, c, d, e, f;
- bool operator==(const state t)const
- {
- 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);
- }
- }s, now, temp, t;
- bool vis[6][6][6][6][6][6];
- queue<state> q;
- state alpha(state s)
- {
- int t;
- t = s.a;
- s.a = s.d;
- s.d = s.e;
- s.e = s.b;
- s.b = t;
- return s;
- }
- state beita(state s)
- {
- int t;
- t = s.b;
- s.b = s.e;
- s.e = s.f;
- s.f = s.c;
- s.c = t;
- return s;
- }
- void clearqueue()
- {
- while (!q.empty())
- {
- q.pop();
- }
- return;
- }
- int main()
- {
- int a, b, c, d, e, f, flag;
- t.a = 1;
- t.b = 2;
- t.c = 3;
- t.d = 4;
- t.e = 5;
- t.f = 6;
- while (scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f) != EOF)
- {
- s.a = a;
- s.b = b;
- s.c = c;
- s.d = d;
- s.e = e;
- s.f = f;
- flag = 0;
- clearqueue();
- q.push(s);
- memset(vis, false, sizeof(vis));
- vis[a][b][c][d][e][f] = true;
- while (!q.empty())
- {
- now = q.front();
- if (now==t)//****************now和t兩個結構體的相等
- {
- flag = 1;
- break;
- }
- q.pop();
- temp = alpha(now);
- if (vis[temp.a][temp.b][temp.c][temp.d][temp.e][temp.f] == false)
- {
- q.push(temp);
- vis[temp.a][temp.b][temp.c][temp.d][temp.e][temp.f] = true;
- }
- temp = beita(now);
- if (vis[temp.a][temp.b][temp.c][temp.d][temp.e][temp.f] == false)
- {
- q.push(temp);
- vis[temp.a][temp.b][temp.c][temp.d][temp.e][temp.f] = true;
- }
- }
- if (flag == 1)
- {
- printf("Yes\n");
- }
- else
- {
- printf("No\n");
- }
- }
- return 0;
- }