[英]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.