string 排序
场景:字母string排序. vector 和 sort 相关.
字母string排序. vector 和 sort 相关.请指教.
由于我要比较的string中只保存 A~Z 字母 或者 为空.所以,排序比较时,我比较 string中的每个元素的 unicode 码. unicode 小的排在前面.
typedef struct SData {
QString fpy; // 一个以 unicode 编码保存数据的 string
int id;
//....other
};
std::vector<SData> vS;
struct cmpfpy {
bool operator()(const SData &a, const SData &b) {
// string 是空
if (a.fpy.isEmpty()) return true; // 当 b.fpy 同时是空时,由于他们都是空,所以 a 排在前面.
if (b.fpy.isEmpty()) return false;
// 得到长度
int alen = a.fpy.length();
int blen = b.fpy.length();
int len = (alen <= blen) ? alen : blen ;
for (int i = 0; i < len ; i++) {
// a.fpy.at(i).unicode() 表示取得第 i 个元素的unicode码
// 相同 skip
if (a.fpy.at(i).unicode() == b.fpy.at(i).unicode()) continue;
// a.fpy 中的元素比 b.fpy 中的元素小
if (a.fpy.at(i).unicode() < b.fpy.at(i).unicode()) return true;
// a.fpy 中的元素比 b.fpy 中的元素大
if (a.fpy.at(i).unicode() > b.fpy.at(i).unicode()) return false;
}
// 元素全部相同.
// 当长度相同时,a 放到前面.
// 当长度不相同,如果 a.fpy 比较短,a放前面. 如果 b.fpy 比较短,b放前面.
//
return (len == alen) ? true: false;
}
};
排序的使用:
// vS 载入一些数据.
sort(vS.begin(), vS.end(), cmpfpy());
排序有时候会死掉,代码执行到 sort(.....); 进入出不来了....请大家帮看看比较函数是不是写的有问题?
ps:数据量才300条左右...当我删除了几条数据时,排序顺利通过了.然后我又删除了几条数据,排序又死了...应该比较函数有毛病
ps1:听说有默认的字母string排序函数?哪位知道请指点一下!
------解决方案--------------------
QString是个啥东西?如果是对string的封装的话,你可以在比较函数中直接使用string的比较函数
int string::compare(const string& );
相等时返回0, 大于时返回>0, 小于时返回<0
------解决方案--------------------
程序没看出什么问题.
编译环境设为UNICODE了吗
------解决方案--------------------
QString是什么东西?
如果QString已经定义了<比较符号,那么直接用好了,不用自己写了
bool operator()(const SData &a, const SData &b)
{
return a.fpy< b.fpy;
}
字母string排序. vector 和 sort 相关.请指教.
由于我要比较的string中只保存 A~Z 字母 或者 为空.所以,排序比较时,我比较 string中的每个元素的 unicode 码. unicode 小的排在前面.
typedef struct SData {
QString fpy; // 一个以 unicode 编码保存数据的 string
int id;
//....other
};
std::vector<SData> vS;
struct cmpfpy {
bool operator()(const SData &a, const SData &b) {
// string 是空
if (a.fpy.isEmpty()) return true; // 当 b.fpy 同时是空时,由于他们都是空,所以 a 排在前面.
if (b.fpy.isEmpty()) return false;
// 得到长度
int alen = a.fpy.length();
int blen = b.fpy.length();
int len = (alen <= blen) ? alen : blen ;
for (int i = 0; i < len ; i++) {
// a.fpy.at(i).unicode() 表示取得第 i 个元素的unicode码
// 相同 skip
if (a.fpy.at(i).unicode() == b.fpy.at(i).unicode()) continue;
// a.fpy 中的元素比 b.fpy 中的元素小
if (a.fpy.at(i).unicode() < b.fpy.at(i).unicode()) return true;
// a.fpy 中的元素比 b.fpy 中的元素大
if (a.fpy.at(i).unicode() > b.fpy.at(i).unicode()) return false;
}
// 元素全部相同.
// 当长度相同时,a 放到前面.
// 当长度不相同,如果 a.fpy 比较短,a放前面. 如果 b.fpy 比较短,b放前面.
//
return (len == alen) ? true: false;
}
};
排序的使用:
// vS 载入一些数据.
sort(vS.begin(), vS.end(), cmpfpy());
排序有时候会死掉,代码执行到 sort(.....); 进入出不来了....请大家帮看看比较函数是不是写的有问题?
ps:数据量才300条左右...当我删除了几条数据时,排序顺利通过了.然后我又删除了几条数据,排序又死了...应该比较函数有毛病
ps1:听说有默认的字母string排序函数?哪位知道请指点一下!
------解决方案--------------------
QString是个啥东西?如果是对string的封装的话,你可以在比较函数中直接使用string的比较函数
int string::compare(const string& );
相等时返回0, 大于时返回>0, 小于时返回<0
------解决方案--------------------
程序没看出什么问题.
编译环境设为UNICODE了吗
------解决方案--------------------
QString是什么东西?
如果QString已经定义了<比较符号,那么直接用好了,不用自己写了
bool operator()(const SData &a, const SData &b)
{
return a.fpy< b.fpy;
}