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<string, string>
或 std::map<int, string>
,并且不需要编写任何代码。跨度>
@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 的想法是正确的——将字符串放入一个结构体中——但没有必要放弃 <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
),如果你跟踪数组中有多少元素并使用它来生成结束迭代器会更好。
【讨论】:
【参考方案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 处理多维字符串数组的主要内容,如果未能解决你的问题,请参考以下文章