語法書 / AA 競程語法書 下冊 / 第十三單元 / 為什麼需要結構體

13.1 為什麼需要結構體

先把「想像一下…」的彆扭一件一件做實。

第一件事:排序。 通訊錄要照座號排。11.4sort 呼之欲出——但它一次只排一個陣列:

sort(seat, seat + n);       // 座號排好了——姓名和電話卻留在原地!

排完的 seatnamephone 徹底對不上,整份通訊錄直接報廢。真要排,得走 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 是姓名還是座號?讀的人得翻回宣告才知道

名字不會說話,程式碼就得靠註解和記憶力撐著。

自己造一個型態

intdoublestringvector……都是別人幫你造好的型態。C++ 其實把「造型態」的工具直接交到你手上:struct。用它定義出來的結構體就是一個全新的資料型態——裡面有哪些欄位、每個欄位叫什麼名字、是什麼型態,全部你說了算。定義完之後,它跟 int 平起平坐:能宣告變數、能開陣列、能整包賦值、能當函式參數、能塞進 vector。