//自然排序 boolcompareNat(const std::string &a, const std::string &b){ if (a.empty()) returntrue; if (b.empty()) returnfalse; if (std::isdigit(a[0]) && !std::isdigit(b[0])) returntrue; if (!std::isdigit(a[0]) && std::isdigit(b[0])) returnfalse; if (!std::isdigit(a[0]) && !std::isdigit(b[0])) { if (std::toupper(a[0]) == std::toupper(b[0])) returncompareNat(a.substr(1), b.substr(1)); return (std::toupper(a[0]) < std::toupper(b[0])); }
// Both strings begin with digit --> parse both numbers std::istringstream issa(a); std::istringstream issb(b); int ia, ib; issa >> ia; issb >> ib; if (ia != ib) return ia < ib;
// Numbers are the same --> remove numbers and recurse std::string anew, bnew; std::getline(issa, anew); std::getline(issb, bnew); return (compareNat(anew, bnew)); } booljudge(const pair<string, string> a, const pair<string, string> b){ returncompareNat(a.first, b.first); }