按日期列排序二维Vector时触发下标越界错误及输出异常排查
问题描述
尝试对存储DD-MM-YYYY格式日期列的二维vector按日期排序并打印,流程为遍历预加载的字符串格式票务数据,通过用户名筛选对应票务存入二维vector后排序打印。输入用户名(如kaya)时触发Debug Assertion Failed! Expression: vector subscript out of range错误;即使不执行排序,vector的输出格式也异常。
异常输出
Search Ticket by Username kaya invalid. Please try again 2 RM40.0 10 15 3 5 2 kaya 15-10-2020 09:30 10:00 6 RM5.0 5 2 3 4 2 kaya 23-06-2022 08:30 09:30 2 RM40.0 10 15 3 5 2 kaya 15-10-2020 09:30 10:00 6 RM5.0 5 2 3 4 2 kaya 23-06-2022 08:30 09:30 C:\Users\Kar Yee\source\repos\DSTR_KyTest\Debug\DSTR_KyTest.exe (process 4044) exited with code 0. To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops. Press any key to close this window . . .
完整代码
#include <iostream> #include <string> #include <vector> #include <iterator> #include <algorithm> // for sort() string defaultTickets[][11] = //ticket_id, total_amount,total_distance, total_travelTime,departure_station_id, //arrival_station_id, user_id, user_name, date, estimated_departure_time, estimated_arrival_time { {"1", "RM20.0", "20", "30", "1", "5", "1", "bob", "10-10-2022", "08:30", "10:30"}, {"2", "RM40.0", "10", "15", "3", "5", "2", "kaya", "15-10-2020", "09:30", "10:00"}, {"3", "RM25.0", "5", "10", "5", "6", "1", "bob", "10-05-2022", "11:30", "012:30"}, {"5", "RM30.0", "13", "40", "1", "6", "4", "zhen Hou", "23-05-2022", "08:00", "09:00"}, {"6", "RM5.0", "5", "2", "3", "4", "2", "kaya", "23-06-2022", "08:30", "09:30"}, {"7", "RM8.0", "8", "4", "1", "3", "4", "zhen Hou", "20-05-2022", "08:45", "09:00"}, {"8", "RM10.0", "3", "10", "4", "6", "1", "bob", "10-05-2022", "09:00", "10:00"}, }; bool SortDateColumn(const std::vector<std::string>& a1, const std::vector<std::string>& a2) { return atoi(a1[8].c_str()) > atoi(a2[8].c_str()); } int main() { int num_col = 10; int num_row = 7; string search_user = ""; // declare 2D vector vector< vector<string>> ticketVector(num_row, vector<string>(num_col)); //preset row and columns //vector< vector<string>> ticketVector(); int size = *(&defaultTickets + 1) - defaultTickets; bool valid = false; cout << "Search Ticket by Username" << endl; cin >> search_user; for (int i = 0; i < size; i++) { if (search_user == defaultTickets[i][7]) { /*cout << "Ticket ID\t Amount Paid\t Distance\t TravelTime \tDeparture_station_id \t Arrival_station_id \tUserID \t Username" << ""; cout << "\tdate \testimated_departure_time \testimated_arrival_time" << "\n";*/ for (int x = 0; x < 11; x++) { cout << defaultTickets[i][x] << "\t"; ticketVector.push_back({ defaultTickets[i][x] }); valid = true; } cout << endl; } if (valid == false) { cout << "invalid. Please try again" << endl; } } //sort(ticketVector[8].begin(), ticketVector[8].end()); /*std::sort (ticketVector.begin(), ticketVector.end(), [](value& a, value& b)->bool { return a.date < b.date; }); for (auto& x : ticketVector) cout << x.date << endl; return 0;*/ //Sort the data using the first column of each `std::vector<std::string>` as the criteria std::sort(ticketVector.begin(), ticketVector.end(), SortDateColumn); //print vector for (int i = 0;i < ticketVector.size();i++) { for (int j = 0;j < ticketVector[i].size();j++) cout << ticketVector[i][j] << ""; cout << endl; } }
问题排查与修复
核心问题列表
- 二维Vector结构混乱:预先初始化了7行10列的空元素,但筛选时用
push_back({defaultTickets[i][x]})把每个字段作为单独行插入,导致Vector既有空行又有单字段行,完全不符合“一行对应一张票”的预期结构。 - 筛选逻辑错误:
valid == false的判断放在循环内部,每遍历一张不匹配的票就输出错误提示,而非遍历完所有票后统一判断。 - 日期排序逻辑失效:直接用
atoi转换DD-MM-YYYY格式字符串,仅能取到日期前两位,无法正确比较日期;同时因Vector结构错误,大量元素长度不足9,访问a1[8]触发下标越界。
修复后的代码
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <sstream> #include <tuple> using namespace std; string defaultTickets[][11] = //ticket_id, total_amount,total_distance, total_travelTime,departure_station_id, //arrival_station_id, user_id, user_name, date, estimated_departure_time, estimated_arrival_time { {"1", "RM20.0", "20", "30", "1", "5", "1", "bob", "10-10-2022", "08:30", "10:30"}, {"2", "RM40.0", "10", "15", "3", "5", "2", "kaya", "15-10-2020", "09:30", "10:00"}, {"3", "RM25.0", "5", "10", "5", "6", "1", "bob", "10-05-2022", "11:30", "012:30"}, {"5", "RM30.0", "13", "40", "1", "6", "4", "zhen Hou", "23-05-2022", "08:00", "09:00"}, {"6", "RM5.0", "5", "2", "3", "4", "2", "kaya", "23-06-2022", "08:30", "09:30"}, {"7", "RM8.0", "8", "4", "1", "3", "4", "zhen Hou", "20-05-2022", "08:45", "09:00"}, {"8", "RM10.0", "3", "10", "4", "6", "1", "bob", "10-05-2022", "09:00", "10:00"}, }; // 将DD-MM-YYYY格式转换为可比较的(年,月,日)元组 tuple<int, int, int> parseDate(const string& dateStr) { stringstream ss(dateStr); string part; int day, month, year; getline(ss, part, '-'); day = stoi(part); getline(ss, part, '-'); month = stoi(part); getline(ss, part, '-'); year = stoi(part); return {year, month, day}; } // 按日期降序排序 bool sortByDateDesc(const vector<string>& ticketA, const vector<string>& ticketB) { return parseDate(ticketA[8]) > parseDate(ticketB[8]); } int main() { string search_user = ""; vector<vector<string>> ticketVector; int totalTickets = *(&defaultTickets + 1) - defaultTickets; bool valid = false; cout << "Search Ticket by Username" << endl; cin >> search_user; // 筛选匹配用户的票务 for (int i = 0; i < totalTickets; i++) { if (search_user == defaultTickets[i][7]) { vector<string> singleTicket; for (int x = 0; x < 11; x++) { singleTicket.push_back(defaultTickets[i][x]); } ticketVector.push_back(singleTicket); valid = true; // 打印找到的票 for (const string& field : singleTicket) { cout << field << "\t"; } cout << endl; } } // 遍历结束后判断是否找到匹配项 if (!valid) { cout << "invalid. Please try again" << endl; return 1; } // 按日期排序 sort(ticketVector.begin(), ticketVector.end(), sortByDateDesc); // 打印排序结果 cout << "\n--- 排序后的票务数据 ---" << endl; for (const vector<string>& ticket : ticketVector) { for (const string& field : ticket) { cout << field << "\t"; } cout << endl; } return 0; }
修复说明
- 修正Vector结构:初始化空二维Vector,找到匹配票时先将整票字段存入一维Vector,再插入二维Vector,保证“一行对应一张票”的结构。
- 优化筛选逻辑:将
valid判断移至循环结束后,避免重复输出错误提示。 - 实现正确日期排序:新增
parseDate函数将日期字符串转换为(年,月,日)元组,利用元组默认比较规则实现正确排序,同时避免下标越界。 - 代码可读性优化:使用范围for循环简化打印,添加命名空间声明减少冗余,增加结果分隔提示。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

