C++ 使用 std::sort 处理多维字符串数组

Posted

技术标签:

【中文标题】C++ 使用 std::sort 处理多维字符串数组【英文标题】:C++ using std::sort for multi dimensional array of strings 【发布时间】:2015-02-23 02:37:03 【问题描述】:

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

【问题讨论】:

我不认为你可以像那样对二维数组进行排序。另外,为什么不使用具有动态大小的向量而不是硬编码的 20000 个字符串数组呢?如果您不使用所有字符串,那么这会占用大量内存(可能是数百 mb)并浪费搜索时间。 我不允许使用向量或来自 STL 的任何东西,这是一个作业。 @abd 如果不允许您使用 STL 中的任何内容,那么您为什么要调用 std::sort?那是一个STL算法函数。 如果您真的想以更 C++ 的方式执行此任务,您可以使用 std::map&lt;string, string&gt;std::map&lt;int, string&gt;,并且不需要编写任何代码。跨度> @abd I've heard that qsort isn't part of the STL but I don't know how to use it. 你不应该使用它。 qsort 对 C++ 类或非 POD 类型一无所知。因此,无法保证当qsort 开始交换您的数据时,它不会将其破坏到无法修复的地步。在此处阅读注释部分:en.cppreference.com/w/cpp/algorithm/qsort 【参考方案1】:

uncletall 的想法是正确的——将字符串放入一个结构体中——但没有必要放弃 &lt;algorithm&gt; 以获得令人讨厌的遗留 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&lt;,它按第一个字符串排序,并将空字符串排序到末尾而不是开头。因为你说数组并不总是满的(恕我直言,你真的应该在这里使用std::vector),如果你跟踪数组中有多少元素并使用它来生成结束迭代器会更好。

【讨论】:

【参考方案2】:

我建议您对数据使用结构:

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

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

【讨论】:

以上是关于C++ 使用 std::sort 处理多维字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

c++ sort 不使用自定义函数

C++ 标准库 sort() / stable_sort() / partial_sort() 对比

C++算法从std::sort到排序算法

C++排序方法

使用 std::sort 对对象向量进行排序

C++中 std::sort 时间复杂度是多少? 是用来sort vector的