C ++使用std :: sort进行多维字符串数组

时间:2015-02-23 02:37:04

标签: c++ arrays string sorting

我有一个字符串数组 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;

}

2 个答案:

答案 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);

这应该足以让你提出自己的解决方案