我有一个字符串数组
string relationarray[10000][2];
取自#include<string>
。在阵列的relationarray [index] [0]处的每个字符串在其开头都有一个4位数字,我试图用来对数组进行排序。阵列通常不满。
来自#include<algorithm>
我尝试使用
std::sort(relationarray,relationarray + (sizeof(relationarray)/sizeof(relationarray[0]))
按顺序进行传送。
但sort将字符串放在数组的末尾,以支持空位。我究竟做错了什么?我尝试为sort的第三个参数创建比较函数,但它没有编译。
bool waytosort(string one, string two){
if (two.empty()){
return false;
}
int first =stoi(one.substr(0,3));
int second=stoi(two.substr(0,3));
return first<second;
}
答案 0 :(得分:1)
uncletall有正确的想法 - 将字符串放入结构中 - 但是没有必要放弃<algorithm>
来讨厌遗留的C代码。
#include <algorithm>
#include <stddef.h>
struct MyData {
string code;
string name;
bool operator <(const MyData& rhs) const
{ return (rhs.code == "") || ((code != "") && (code < rhs.code)); }
};
static const size_t kNumElements = 100000;
MyData* data[kNumElements];
sort(data, data + kNumElements);
这里唯一的神奇之处在于为第一个字符串排序的新结构定义operator<
,并将空字符串排序到结尾而不是开始。既然你说阵列并不总是满的(恕我直言你真的应该在这里使用std::vector
),如果你跟踪数组中有多少元素并用它来生成结尾会更好迭代器。
答案 1 :(得分:0)
我建议您为数据使用结构:
typedef struct {
string code;
string name;
} my_data;
int compare_my_data(const void *p1, const void *p2)
{
const my_data *e1 = reinterpret_cast<const my_data*>(p1);
const my_data *e2 = reinterpret_cast<const my_data*>(p2);
return e1->code.compare(e2->code);
}
my_data mydata[100000];
std::qsort(mydata, 10000, sizeof(mydata), compare_my_data);
这应该足以让你提出自己的解决方案