假设:
有这么一个字符串集合,"1","2","3",........."10000000", "40","20".
要求进行排序。
基本想法: 把字符串转化为数字,进行对比。
但是有一个问题:也许这个字符串的长度超过了 普通整数的范围了,怎么办? 有人说用 long long ,可以,但不优雅,而且无法对更加大的数字进行排序。
解决方法: 使用大数的思想。代码如下;
#include <iostream>
#include <functional>
#include <map>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <utility>
#include <cassert>
using namespace std;
struct string_Intnumber_checker{
bool operator()(const string& str) const{
if(!str.empty())
{
if(string::npos == str.find_first_not_of("0123456789"))
{
return true;
}
}
return false;
}
};
struct string_Intnumber_cmp{
bool operator()(const string& x, const string& y) const{
string_Intnumber_checker checker;
assert(checker(x));
assert(checker(y));
if(x.length() > y.length())
{
return false;
}
else if(x.length() == y.length())
{
int len = x.length() - 1;
while(x[len] == y[len] && x.length() >= 0)
len--;
if(len >= 0 && x[len] > y[len])
return false;
else
return true;
}
else
{
return true;
}
}
};
int main()
{
vector<string> strVec = {"111111119999999999800008888888888888888888","1", "9", "20", "7", "40"};
sort(strVec.begin(), strVec.end(), string_Intnumber_cmp());
copy(strVec.begin(), strVec.end(), ostream_iterator<string>(cout,"\n"));
}
结果如下:
1
7
9
20
40
111111119999999999800008888888888888888888