You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按日期列排序二维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;
}

修复说明

  1. 修正Vector结构:初始化空二维Vector,找到匹配票时先将整票字段存入一维Vector,再插入二维Vector,保证“一行对应一张票”的结构。
  2. 优化筛选逻辑:将valid判断移至循环结束后,避免重复输出错误提示。
  3. 实现正确日期排序:新增parseDate函数将日期字符串转换为(年,月,日)元组,利用元组默认比较规则实现正确排序,同时避免下标越界。
  4. 代码可读性优化:使用范围for循环简化打印,添加命名空间声明减少冗余,增加结果分隔提示。

内容的提问来源于stack exchange,提问作者user123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:51:45