模擬 12306 核心功能,需存儲每個火車班次的:
struct Station {
std::string name;
int remainingTickets; // 該站點上車後剩余票數
};
struct Train {
std::string trainNo;
int totalSeats;
std::vector stations; // 動態數組存儲停靠站
};
std::vector trains; // 所有班次
優點:內存連續,緩存友好;隨機訪問 O(1);代碼直觀,易於序列化/持久化;
缺點:插入/刪除班次需移動元素(但班次數相對固定,影響微乎其微)。
雖然插入刪除 O(1),但查找特定班次或站點需 O(N) 遍歷,且指針開銷大,破壞緩存局部性,調試困難。現代 C++ 極少在業務邏輯層手寫鏈表。
// 以班次號為鍵,O(1) 精確查找
std::unordered_map trainMap;
// 站點查詢優化:站點名 -> 經過該站的班次列表
std::unordered_map> stationIndex;
適合大規模數據、高頻查詢場景。
「各停靠站剩余票數」實際上是區間庫存。例如北京→上海,中間經濟南、南京:
建議在 Train 中維護 std::vector,長度為 stations.size()-1,每個元素代表相鄰兩站間的剩余座位數。售票時檢查並扣減相關區段。
struct + std::vector,結構清晰,性能足夠。unordered_map 索引,考慮鎖或無鎖結構保護共享數據。核心原則:先用最簡單的結構跑通業務,再根據性能分析優化。過早優化是萬惡之源。