谈谈结构体部分成员排序(重载的利用/sort)
涉及知識點:
1.重載運算符的知識
2.sort函數的使用
3.高精度排序
sort函數的用法?
通過面向百度GOOGLE編程的我,得知,sort的用法
sort函數詳解(史上最完整QAQ) - AlvinZH - 博客園
對于數組而言,sort語法結構為 sort(數組名,數組名+數組長度)//可以有第三個參數,為比較函數,一般來說都是要做一個比較函數的。
對于vector容器而言,sort語法結構為 sort (迭代器.begin(),迭代器.end())//可以有第三個參數
重載運算符有什么用?
可以擴充各種操作符,更方便運用和避免部分復雜語法。
在本篇文章中重載小于號,使比較操作放在結構體內進行,相比于比較函數,更加節省時間,訪問速度更快
語法結構為 bool operator 需要重載的符號 (形參列表){ to do }
bool operator <(const people &orter)const{return z < orter.z }例題1:洛谷算法1-2?P5143 攀巖者
傳送門:攀爬者 - 洛谷
?
思路 ,根據題目的意思,先要將輸入的數據進行一個關于高度成員的排序,此時有兩種思路,1.sort ,做一個比較函數來比較結構體成員大小;
2.sort,利用重載技術,重載小于號符號,使比較在結構體內部進行。
上題解:
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<algorithm> #include<math.h> using namespace std; #define MAX 5000 struct Node {double x, y, z;bool operator <(const Node& other)const {return z < other.z;//高度逐漸增高/} }NodeXYZ[MAX]; int main() {int n;cin >> n;for (int i = 0; i < n; i++) {scanf("%lf%lf%lf", &NodeXYZ[i].x, &NodeXYZ[i].y, &NodeXYZ[i].z);}sort(NodeXYZ, NodeXYZ + n);//根據高度從小到大排序。這里對小于號重載,sort排序在結構體內部進行,節省時間double distance = 0;double cx = NodeXYZ[0].x, cy = NodeXYZ[0].y, cz = NodeXYZ[0].z;for (int i = 0; i < n; i++) {distance += sqrt(abs(cx - NodeXYZ[i].x) * abs(cx - NodeXYZ[i].x) + abs(cy - NodeXYZ[i].y) * abs(cy - NodeXYZ[i].y) + abs(cz - NodeXYZ[i].z) * abs(cz - NodeXYZ[i].z));//兩點的歐幾里得距離cx = NodeXYZ[i].x;cy = NodeXYZ[i].y;cz = NodeXYZ[i].z;}printf("%.3lf\n", distance); }什么是高精度排序?
高精度排序,有多種表示方式,有用數組的,也可以用string做成字符串。本次使用后者
我們知道,編譯器無法去接受特別大的數,如9999!這時候就要利用的高精度的知識。
通過將一大串數字轉化成字符串的思想(或者把幾個數字存在數組的一個位置中,也被稱壓縮高精度)就可以實現編譯器的讀寫。
例題2: 洛谷算法1-2?P1781 宇宙總統
傳送門:宇宙總統 - 洛谷
思路? 數據過大,這時候就要考慮高精度的排序方法,先做一個string類型的變量,for循環連續輸入string變量。再去比較這幾個數的長度:
1.如果長度不一,大的作為max。
2.如果長度相同,比較值的大小。
上題解:
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include<string>int main() {string max = " ";//一開始把max定義i成空格,后續進行比較,大的就替換string in;int n,id;//id是記錄最多人的編號cin >> n;for (int i = 1; i <= n; i++) {cin >> in;int inSize = in.size();int maxSize = max.size();if (inSize > maxSize || (inSize >= maxSize && in > max)) {max = in;id = i;}}cout << id << endl << max; }最后來一道真正需要用到結構體成員排序的題
例題3: 洛谷算法1-2?P1093 獎學金
傳送門:[NOIP2007 普及組] 獎學金 - 洛谷
題解:
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #define MAX 500 #include<algorithm>struct people {int chinese;int english;int math;int sum;int num;//編號 }students[MAX]; //比較函數一般自己構造。結構體部分元素的排序通過sort的比較函數部分實現。 bool compare(people s1, people s2) {if (s1.sum > s2.sum) return 1;else if (s1.sum < s2.sum) return 0;else{if (s1.chinese > s2.chinese) return 1;else if (s1.chinese < s2.chinese) return 0;else{if (s1.num > s2.num) return 0;else return 1;}} } int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {students[i].num = i;cin >> students[i].chinese >> students[i].english >> students[i].math;students[i].sum = students[i].chinese + students[i].english + students[i].math;}sort(students+1, students+1 + n, compare);for (int i = 1; i <= n ; i++)cout << students[i].num << " " << students[i].sum << endl; }?這里我一開始錯了,語法錯誤是people成員未定義,仔細排查才知道,原來是把比較函數放在結構體前面了,導致people成員未定義
?今天的文章就分享到這,編程小白,知識掌握尚淺,若有出入和漏洞,希望大佬們能提點一二。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的谈谈结构体部分成员排序(重载的利用/sort)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uploader什么意思_【已解决】请问
- 下一篇: vue怎么获取用户的位置经纬度_vue