#include <iostream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
template<typename T >
void fun(T val)
{
cout << val << endl;
}
bool cmp(string s1, string s2)
{
int n1 = s1.size();
int n2 = s2.size();
int n = min(n1, n2);
//逐位比较字典序
for (int i = 0; i < n; i++)
{
char c1 = s1[i];
char c2 = s2[i];
if (c1 == c2)
continue;
else if (c1 < c2)
return true; //s1字典序更小
else
return false; //s2字典序更小,交换位置
}
//到这一步说明两个字符串前n位相同,比较字符串长度
return n1 < n2;
//n1<n2时不用交换位置
//n2<=n1时交换位置
}
int main()
{
vector<string> vec = { "abcdf","aaaer","bcda","qweqeqeqe","ab","a","b" };
//1方法
cout << "------------cmp func------------" << endl;
sort(vec.begin(), vec.end(), cmp);
for_each(vec.begin(), vec.end(), fun<string>);
//2方法
cout << "------------operator<------------" << endl;
sort(vec.begin(), vec.end(), [](const string& a, const string& b) {
return a < b; //string类中重载<号可以自动比较字典序大小
});
for_each(vec.begin(), vec.end(), fun<string>);
//3方法
cout << "------------string::compare------------" << endl;
sort(vec.begin(), vec.end(), [](const string& a, const string& b) {
return a.compare(b) < 0; //相等返回0,a<b时返回-1,a>b时返回1;
});
for_each(vec.begin(), vec.end(), fun<string>);
return 0;
}
测试结果
PS: string类中重载<号内部就是调用compare,下面是vs2019中的string源码
template <class _Elem, class _Traits, class _Alloc>
_NODISCARD bool operator<(
const basic_string<_Elem, _Traits, _Alloc>& _Left, const basic_string<_Elem, _Traits, _Alloc>& _Right) noexcept {
return _Left.compare(_Right) < 0;
}