[英]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
.first
或std::multimap
)会为您处理排序。 要同时对.second
.first
排序,那么上面的解决方案也不错。
默认情况下std::pair
和std::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.