繁体   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