C++ 如何实现字典序排序法,自然排序
类似PHP的natcasesort函数,整了一天没有头绪.
数组是vector
排序前:
[0] => IMG0.png
[1] => IMG3.png
[2] => img1.png
[3] => img10.png
[4] => img12.png
[5] => img2.png
排序后:
[0] => IMG0.png
[1] => img1.png
[2] => img2.png
[3] => IMG3.png
[4] => img10.png
[5] => img12.png
------解决方案--------------------
其实楼主的意思就是按数字大小排序呗? 预处理的时候把数值部分摘出来作为排序的key。
------解决方案--------------------
定位到数字部分,读取数字再比较?
bool compare(const string& name1, const string& name2)
{
int num1, num2;
sscanf(name1.c_str()+3, "%d", &num1);
sscanf(name2.c_str()+3, "%d", &num2);
return num1
}
------解决方案--------------------
sort(vector.begin(),vector.end(),[](const string&a,const string&b){return a[3]<b[3];});泛型算法和lambda
------解决方案--------------------
直接添加到容器,自动排序
------解决方案--------------------
引用:Quote: 引用:定位到数字部分,读取数字再比较?
bool compare(const string& name1, const string& name2)
{
int num1, num2;
sscanf(name1.c_str()+3, "%d", &num1);
sscanf(name2.c_str()+3, "%d", &num2);
return num1
}
这样就有点局域性了,不能确定后面一定是数字
那你倒是说说具体的规则啊,对于你举的例子,以上那个比较规则应该是够了
------解决方案--------------------
std::sort(files.begin(),files.end(), [](const std::string& a, const std::string& b)
{
return a.substr(3,std::string::npos)
});
------解决方案--------------------
简单的写了下 用的是qsort
#include
#include
#include
char data[6][10]={{"img0"},
{"img3"},
{"img1"},
{"img10"},
{"img12"},
{"img2"}};
int cmp(const void *a, const void *b)
{
char *temp_a = (char *)a;
char *temp_b = (char *)b;
// 如果两个字符串的长度不相等那么就把少的放前面
if(strlen(temp_a)!= strlen(temp_b))
return strlen(temp_a)-strlen(temp_b);
// 两字符串相等,就升序
for(int i=0; i
{
if(temp_a[i]!=temp_b[i])
return temp_a[i]-temp_b[i];
}
}
int main()
{
printf("排序前:\n");
for(int i=0; i
printf("%s\n", data[i]);
qsort(data, 6, 10*sizeof(char), cmp);
printf("排序后:\n");
for(int i=0; i
printf("%s\n", data[i]);
return 0;
}
------解决方案--------------------
------解决方案--------------------