最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在C++中正確處理日期字符串排序的方法

 更新時間:2026年01月08日 08:55:14   作者:weixin_pk138132  
在C++編程中,排序是一個核心任務,std::sort(來自 <algorithm>)是一個極其強大的神奇黑盒,可以為你排序 vector,本文給大家介紹了在C++中正確處理日期字符串排序的方法,需要的朋友可以參考下

在C++編程中,排序是一個核心任務。std::sort(來自 <algorithm>)是一個極其強大的“神奇黑盒”,可以為你排序 vector

  • vector<int> nums = {50, 10, 30};
  • std::sort(nums.begin(), nums.end()); -> nums 變成 {10, 30, 50} (從小到大)。
  • vector<string> names = {"Charlie", "Alice"};
  • std::sort(names.begin(), names.end()); -> names 變成 {"Alice", "Charlie"} (按字母順序)。

但是,如果你有一堆“日期”字符串呢?
vector<string> dates = {"10-12-2023", "05-01-2024"};

如果你“天真地”調用 std::sort
std::sort(dates.begin(), dates.end());

  • 結果會是:{"05-01-2024", "10-12-2023"}。
  • 這是錯誤的! 2024年的日期排在了2023年的前面

一個簡單的比喻:“字典” vs “日歷”

  • 默認 std::sort (用于字符串):就像一個“字典”。它懂“字母順序”。在“字典”里,"0" (以 ‘0’ 開頭) 確實排在 "1" (以 ‘1’ 開頭) 的前面。
  • 你想要的(日期排序):就像一個“日歷”。你需要一種“智能”排序,它能理解 Year (年), Month (月), Day (日) 的邏輯關系。

解決方案:
我們不能直接排序字符串。我們必須:

  1. “教會” C++ 如何“閱讀”日期。最好的方法是創(chuàng)建一個“自定義盒子”(struct),把日期拆分成“年”、“月”、“日”三個整數(shù)。
  2. “教會” std::sort 我們的“日歷規(guī)則”。我們必須提供一個“自定義比較器”(Comparator)函數(shù),告訴 std::sort:“先比較年份,如果年份相同,再比較月份…

在本教程中,你將學會:

  • 為什么不能直接排日期字符串(“字典” vs “日歷”)。
  • 如何使用 struct 來“打包”日期數(shù)據(jù) (Y, M, D)。
  • “黃金法則”:如何編寫一個“自定義比較器”函數(shù) (Comparator)。
  • std::sort 的“第三個參數(shù)”:如何把你的“規(guī)則”傳遞給 std::sort。
  • 實戰(zhàn)演練:編寫一個完整的 sortDates 程序。
  • “X光透 視”:用調試器“親眼目睹” std::sort 是如何“調用”你的“自定義規(guī)則”的。

前置知識說明 (100% 自洽):

  • 變量 (Variable):理解存儲數(shù)據(jù)的“盒子”,如 int year = 2024;。
  • vector (向量):C++標準庫提供的一種“動態(tài)數(shù)組”(“魔法彈性盒子列表”)。你需要 #include <vector>
  • struct (結構體):一種“藍圖”,用于創(chuàng)建“自定義盒子”,把相關數(shù)據(jù)(如 y, m, d)打包在一起。
  • #include <algorithm>std::sort “神奇黑盒”所在的“工具包”。
  • bool 函數(shù):一個返回 true (真) 或 false (假) 的函數(shù),我們將用它來編寫“規(guī)則”。
  • if/else if/else:用于編寫“規(guī)則”的邏輯判斷。
  • 編譯 (Compile):C++代碼(“食譜”)必須被“編譯”(“烘焙”),才能變成電腦可執(zhí)行的程序(“蛋糕”)。

第一部分:“自定義盒子”——Date結構體

首先,我們“設計”一個“藍圖”,告訴C++一個 Date 對象長什么樣。

#include <iostream>
#include <vector>
#include <algorithm> // 包含 std::sort
#include <string>
using namespace std;

// “藍圖”:一個自定義的 Date 盒子
// 它把日期“拆分”成三個 *可比較* 的整數(shù)
struct Date {
    int day;
    int month;
    int year;
};

現(xiàn)在,我們可以創(chuàng)建 Date 對象的 vector,而不是 stringvector
vector<Date> calendar = { {10, 12, 2023}, {5, 1, 2024}, {15, 12, 2023} };

第二部分:“日歷規(guī)則”——自定義比較器

std::sort 的“默認規(guī)則”是 operator< (小于號)。我們現(xiàn)在要提供一個的“規(guī)則手冊”(一個函數(shù)),來代替 <

比較器 (Comparator) 的“黃金法則”:
std::sort 需要一個函數(shù) bool compare(A, B)。

  • 如果你希望 A 排在 B前面,你的函數(shù)必須返回 true。
  • 如果你希望 A 排在 B后面(或相同),你的函數(shù)必須返回 false。

compareDates.cpp (“日歷規(guī)則”函數(shù))

// “規(guī)則手冊”:告訴 std::sort 如何比較兩個 Date 對象
bool compareDates(const Date& a, const Date& b) {
    
    // 規(guī)則 1:先比較“年”
    if (a.year < b.year) {
        return true;  // a 的年份小,a 應該排在前面
    }
    if (a.year > b.year) {
        return false; // a 的年份大,a 應該排在后面
    }
    
    // “行內(nèi)預警”:如果程序運行到這里,說明 a.year == b.year
    
    // 規(guī)則 2:如果年份相同,再比較“月”
    if (a.month < b.month) {
        return true;  // a 的月份小,a 應該排在前面
    }
    if (a.month > b.month) {
        return false; // a 的月份大,a 應該排在后面
    }
    
    // “行內(nèi)預警”:如果程序運行到這里,說明年份和月份都相同
    
    // 規(guī)則 3:如果月份相同,最后比較“日”
    return (a.day < b.day); // 如果 a.day 小,返回 true
}

第三部分:“實戰(zhàn)演練”——結合sort與“規(guī)則”

現(xiàn)在我們把 std::sort 和我們的“規(guī)則手冊” compareDates 結合起來。

date_sort.cpp (完整代碼)

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

// --- 1. “藍圖” ---
struct Date {
    int day;
    int month;
    int year;
};

// --- 2. “規(guī)則手冊” ---
bool compareDates(const Date& a, const Date& b) {
    if (a.year < b.year) return true;
    if (a.year > b.year) return false;
    
    // 年份相同
    if (a.month < b.month) return true;
    if (a.month > b.month) return false;
    
    // 月份也相同
    return (a.day < b.day);
}

// 輔助函數(shù):打印日期
void printDates(const string& title, const vector<Date>& dates) {
    cout << title << endl;
    for (const auto& d : dates) {
        // (為了美觀,我們補 0)
        printf("  %02d-%02d-%04d\n", d.day, d.month, d.year);
    }
}


int main() {
    // 3. 創(chuàng)建“自定義盒子”列表
    vector<Date> calendar = {
        {10, 12, 2023}, // 10-Dec-2023
        {5,  1,  2024}, // 05-Jan-2024
        {15, 12, 2023}, // 15-Dec-2023
        {2,  2,  2023}  // 02-Feb-2023
    };
    
    printDates("--- 原始順序 ---", calendar);

    // 4. “按下按鈕”并“遞上紙條” (規(guī)則手冊)
    std::sort(calendar.begin(), calendar.end(), compareDates);

    printDates("\n--- 日歷排序后 ---", calendar);
    
    return 0;
}

“手把手”終端模擬:

PS C:\MyCode> g++ date_sort.cpp -o date_sort.exe -std=c++11
PS C:\MyCode> .\date_sort.exe
--- 原始順序 ---
  10-12-2023
  05-01-2024
  15-12-2023
  02-02-2023

--- 日歷排序后 ---
  02-02-2023
  10-12-2023
  15-12-2023
  05-01-2024

頓悟時刻: 排序成功std::sort 正確地理解了我們的“日歷規(guī)則”,將 2023 年的日期排在了 2024 年的前面。

第四部分:“X光透 視”——親眼目睹“規(guī)則”被調用

我們無法(也不需要)用調試器“步入” (F11) std::sort 內(nèi)部,因為它是一個高度優(yōu)化的、編譯好的“黑盒”。
但是,我們可以“步入”它調用我們的“自定義規(guī)則” (compareDates)!

“X光”實戰(zhàn)(基于date_sort.cpp)

設置斷點:

  • 動作: 在VS Code中,把你的鼠標移動到**“規(guī)則手冊”函數(shù) compareDates 內(nèi)部的第16行**(if (a.year < b.year))的行號左邊。
  • 點擊那個小 red dot,設置一個斷點

啟動“子彈時間”(F5):

  • 動作: 按下 F5 鍵。
  • 你會看到: 程序執(zhí)行 main,創(chuàng)建 vector,打印“原始順序”。
  • 當程序執(zhí)行到 std::sort(...) 這一行時,它會**“跳進”你的 compareDates 函數(shù),“凍結”**在第16行!

開啟“X光”(觀察“裁判”工作):

  • 動作: 仔細看那個“變量”(VARIABLES)窗口。
  • 你會看到:
    • a: {day: 5, month: 1, year: 2024}
    • b: {day: 10, month: 12, year: 2023}
  • 頓悟時刻: std::sort(“黑盒”)為了決定 “2024年” 和 “2023年” 誰該排前面,它把這兩個對象“遞”給了你的“裁判” (compareDates)!
  • 動作: 按下 F10 鍵(“Step Over”)。
  • 你會看到: (a.year < b.year) (即 2024 < 2023) 計算為 false。高亮條跳到第19行。
  • 動作: 按下 F10 鍵。
  • 你會看到: (a.year > b.year) (即 2024 > 2023) 計算為 true。函數(shù)返回 false。sort 知道了 “2024” 應該在 “2023” 后面。

繼續(xù)執(zhí)行 (F5)。

第二次“凍結” (在 compareDates 內(nèi)部):

  • 動作: 按下 F5 鍵,程序會再次停在 compareDates 斷點處。
  • 觀察“變量”窗口:
    • a: {day: 15, month: 12, year: 2023}
    • b: {day: 10, month: 12, year: 2023}
  • 頓悟時刻: std::sort 現(xiàn)在正在比較兩個同年份的日期!
  • 動作: 按下 F10 鍵(if (a.year < b.year) -> false)。
  • 動作: 按下 F10 鍵(if (a.year > b.year) -> false)。
  • (關鍵?。?/strong> 高亮條移動到第24行(比較月份)。
  • 動作: 按下 F10 鍵(if (a.month < b.month) (12 < 12) -> false)。
  • 動作: 按下 F10 鍵(if (a.month > b.month) (12 > 12) -> false)。
  • 動作: 按下 F10 鍵(return (a.day < b.day) (15 < 10) -> false)。
  • 頓悟時刻: sort 知道了 “15號” 應該在 “10號” 后面。

(繼續(xù)按 F5,sort 會調用你的“裁判”很多次…)

動手試試!(終極挑戰(zhàn):你的“學生排名器”)

現(xiàn)在,你來當一次“教務處”老師。

任務:

  1. 設計一個 Student 結構體
    • string name;
    • int score; (分數(shù))
    • int age;
  2. 創(chuàng)建一個 vector<Student> 并填入一些數(shù)據(jù)。
  3. 編寫一個“規(guī)則手冊”bool compareStudents(const Student& a, const Student& b)。
  4. (關鍵) 排序規(guī)則是:
      1. 優(yōu)先按分數(shù) (score) 降序(分數(shù)高的排前面)。
      1. 如果分數(shù)相同,則按年齡 (age) 升序(年齡小的排前面)。
  5. 調用 std::sort,傳入你的“規(guī)則手冊”。
  6. 打印排序后的學生列表。

student_sort.cpp (你的 TODO):

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

// --- TODO 1: Student 結構體 ---
struct Student {
    string name;
    int score;
    int age;
};

// --- TODO 3 & 4: 編寫 *新* 的“規(guī)則” ---
// (按分數(shù)降序, 同分按年齡升序)
// bool compareStudents(const Student& a, const Student& b) {
//     // 1. 先比較分數(shù)
//     if (a.score > b.score) return true;  // 分數(shù)高,排前面
//     if (a.score < b.score) return false; // 分數(shù)低,排后面
    
//     // 2. 如果分數(shù)相同 (a.score == b.score)
//     //    再比較年齡 (升序)
//     // return a.age < b.age; // 年齡小,排前面
// }

int main() {
    // --- TODO 2: 創(chuàng)建數(shù)據(jù) ---
    vector<Student> students = {
        {"Alice", 90, 20},
        {"Bob", 85, 22},
        {"Charlie", 90, 19}, // <-- 和 Alice 同分
        {"David", 70, 21}
    };
    
    cout << "--- 原始列表 ---" << endl;
    // (在此處添加 for 循環(huán)打印)

    // --- TODO 5: 調用 sort ---
    // std::sort(students.begin(), students.end(), ...);

    cout << "\n--- 排序后 ---" << endl;
    // --- TODO 6: 打印結果 ---
    // (在此處添加 for 循環(huán)打印)
    // 預測:Charlie (90, 19) 應該在 Alice (90, 20) 之前
    
    return 0;
}

這個挑戰(zhàn)讓你實踐了如何編寫一個“多級”比較規(guī)則,這是 std::sort 在真實項目中極其常見的用法!

以上就是在C++中正確處理日期字符串排序的方法的詳細內(nèi)容,更多關于C++日期字符串排序處理方法的資料請關注腳本之家其它相關文章!

相關文章

  • C++中priority_queue與仿函數(shù)實現(xiàn)方法

    C++中priority_queue與仿函數(shù)實現(xiàn)方法

    這篇文章主要給大家介紹了關于C++中priority_queue與仿函數(shù)實現(xiàn)的相關資料,優(yōu)先級隊列是一種容器適配器,其底層通常采用vector容器,并通過堆算法來維護元素的順序,文中通過代碼介紹的非常詳細《》需要的朋友可以參考下
    2024-10-10
  • C語言中函數(shù)遞歸的實現(xiàn)示例

    C語言中函數(shù)遞歸的實現(xiàn)示例

    本文系統(tǒng)介紹了C語言中的遞歸概念與應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-11-11
  • 淺析C語言中typeof關鍵字用法

    淺析C語言中typeof關鍵字用法

    typeof關鍵字是C語言中的一個新擴展。在linux內(nèi)核源代碼中廣泛使用。接下來通過本文給大家分享C語言中typeof關鍵字用法,需要的朋友參考下
    2017-02-02
  • C++標準模板庫string類的介紹與使用講解

    C++標準模板庫string類的介紹與使用講解

    今天小編就為大家分享一篇關于C++標準模板庫string類的介紹與使用講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • c++11?類中關于default、explict、implicit、noexcept、final的詳解

    c++11?類中關于default、explict、implicit、noexcept、final的詳解

    這篇文章主要介紹了c++11?類中關于default、explict、implicit、noexcept、final的詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Dev C++中文亂碼的有效解決方案

    Dev C++中文亂碼的有效解決方案

    在DevC++中出現(xiàn)漢字亂碼的問題通常是由于編碼設置不正確導致的,本文通過圖文結合的方式給大家介紹了解決方法,對大家的解決問題有一定的幫助,需要的朋友可以參考下
    2025-04-04
  • 解決C++ 無法從void 轉換為LRESULT的方法詳解

    解決C++ 無法從void 轉換為LRESULT的方法詳解

    本篇文章是對C++中無法從void轉換為LRESULT的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++的static關鍵字及變量存儲位置總結

    C++的static關鍵字及變量存儲位置總結

    今天看博文時,看到了c++的static關鍵字的一些總結,還涉及到了一些代碼的存儲位置;接下來為您詳細呈現(xiàn)
    2012-11-11
  • 一篇文章帶你了解C++Primer學習日記--處理數(shù)據(jù)

    一篇文章帶你了解C++Primer學習日記--處理數(shù)據(jù)

    今天小編就為大家分享一篇關于C++對數(shù)器的使用講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • C++高精度算法的使用場景詳解

    C++高精度算法的使用場景詳解

    在我們進行計算的過程中,經(jīng)常會遇到幾十位,甚至幾百位的數(shù)字的計算問題,也有可能會遇到小數(shù)點后幾十位,幾百位的情況,而我們面對這樣的情況下,long long  和 double 的數(shù)據(jù)范圍顯然是不夠使用的了。因此這時,我們就需要引入一個新的算法,叫做高精度算法
    2022-09-09

最新評論

阿拉尔市| 那坡县| 繁峙县| 定结县| 丰都县| 望谟县| 宣化县| 石门县| 华阴市| 蒙自县| 三明市| 中西区| 天长市| 从江县| 盐池县| 朝阳市| 连江县| 华宁县| 彩票| 金川县| 望奎县| 广宁县| 绍兴市| 奉节县| 玛曲县| 讷河市| 石家庄市| 平度市| 长垣县| 桑日县| 灵川县| 子长县| 万载县| 廉江市| 凌海市| 黔南| 攀枝花市| 旅游| 洪雅县| 偃师市| 广昌县|