簡體   English   中英

比較器返回在 C++ 中的真正含義是什么

[英]What does comparator return really mean in C++

我正在嘗試在 C++ 中進行穩定排序,我的數組是這樣的

{{first = "藝術零", second = "let3"}, {first = "自己的工具箱挖掘", second = "let2"}, {first = "藝術罐", second = "let1"}}

sort(let.begin(), let.end(),
[](pair<string,string>& a, pair<string,string>& b) {
    int comp = a.first.compare(b.first);
    if(!comp) {
        return a.second.compare(b.second);
    } else {
        return comp;
    }
});

為什么它沒有按字典順序對第一個值進行排序? C++ 比較器中的返回值到底意味着什么? 謝謝

如果您只是選擇std::map作為容器,則默認排序以詞法排序順序提供存儲,例如

#include <iostream>
#include <string>
#include <map>

int main (void) {
    
    std::map<std::string, std::string> let {{"art zero", "let3 "}, 
                                            {"own kit dig", "let2 "},
                                            {"art can", "let1 "}};
    for (const auto& p : let)
        std::cout << p.first << ", " << p.second << '\n';
}

示例使用/輸出

$ ./bin/map_sort_lex
art can, let1
art zero, let3
own kit dig, let2

對兩者進行排序你不能使用map/mutimap

如果您必須對.second .first電報排序,則不能使用std::map/std::multimap 它們僅限於在.first上進行排序以進行存儲。 另一種選擇是帶有字符串對的std::vector<std::pair<>>

您可以通過編寫簡單的bool比較function 來實現自定義比較,如下所示:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

bool lexcmp (const std::pair<std::string, std::string>& lhs, 
             const std::pair<std::string, std::string>& rhs)
{
    if (lhs.first != rhs.first)
        return lhs.first < rhs.first;
    
    return lhs.second < rhs.second;
}

int main (void) {
    
    std::vector<std::pair<std::string, std::string>> let {{"art zero", "let3 "}, 
                                                          {"art zero", "let2 "},
                                                          {"own kit dig", "let2 "},
                                                          {"art can", "let1 "}};
    
    std::sort (let.begin(), let.end(), lexcmp);
    
    for (const auto& p : let)
        std::cout << p.first << ", " << p.second << '\n';
}

示例使用/輸出

添加一個額外的"art zero", "let2 "對以強制對.second進行排序后,您將擁有:

$ ./bin/vector_sort_lex
art can, let1
art zero, let2
art zero, let3
own kit dig, let2

如果您可以只對 .first 進行排序,那么std::map .firststd::multimap )會為您處理排序。 要同時對.second .first排序,那么上面的解決方案也不錯。

默認情況下std::pairstd::string已經提供了字典順序,因此您無需為此任務編寫比較 function

如果你確實想寫一個比較 function 它必須滿足比較要求。 它必須提供嚴格的弱排序 這意味着如果第一個值出現在第二個之前,則返回true ,否則返回false

您可以修復您的代碼,使其對“小於”返回true ,否則返回false

sort(let.begin(), let.end(), [](const pair<string,string> &a, const pair<string,string> &b){
    int comp = a.first.compare(b.first);
    if (comp == 0) {
        return a.second.compare(b.second) < 0; // less than (ascending order)
    } else
        return comp < 0; // less than (ascending order)
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM