13.1 為什麼需要結構體
先把「想像一下…」的彆扭一件一件做實。
第一件事:排序。 通訊錄要照座號排。11.4 的 sort 呼之欲出——但它一次只排一個陣列:
sort(seat, seat + n); // 座號排好了——姓名和電話卻留在原地!
排完的 seat 跟 name、phone 徹底對不上,整份通訊錄直接報廢。真要排,得走 11.6 的「排編號」繞路:多開一個編號陣列、比較函式回頭查 seat[]……能動,但每次都要多養一個陣列,輸出時 name[id[i]]、phone[id[i]] 寫得滿手都是索引。
第二件事:傳遞。 寫個函式印出一位同學的完整資料,參數表得把三個陣列全帶上(上冊 7.7 的陣列參數):
void printStudent(string name[], int seat[], string phone[], int i) {
cout << seat[i] << ' ' << name[i] << ' ' << phone[i] << '\n';
}
之後老師想加一個 email 欄位——開第四個陣列,然後每一個這樣的函式都要跟著多一個參數。欄位越多,程式越發散。
¶pair 差一步
10.11 的 pair 正是為「綁成一包」而生的,而且它真的解決了一部分問題——兩個值綁進同一個變數、內建比較規則、跟 sort 和 vector 無縫接軌。可惜差一步:
- 它恰好只能綁兩個。姓名和座號塞進去了,電話就進不來。
- 兩個成員永遠叫 first 和 second,名字本身沒有意義:
pair<string, int> p = {"temmie", 60}; // 姓名和座號勉強塞得下……電話呢?
cout << p.first; // first 是姓名還是座號?讀的人得翻回宣告才知道
名字不會說話,程式碼就得靠註解和記憶力撐著。
¶自己造一個型態
int、double、string、vector……都是別人幫你造好的型態。C++ 其實把「造型態」的工具直接交到你手上:struct。用它定義出來的結構體就是一個全新的資料型態——裡面有哪些欄位、每個欄位叫什麼名字、是什麼型態,全部你說了算。定義完之後,它跟 int 平起平坐:能宣告變數、能開陣列、能整包賦值、能當函式參數、能塞進 vector。