两个数组,其中每个变量(如 a[1]和 b[1] 、 a[i] 和 b[i] 等等)是同一个东西的两种性质,对其中一个数组排序之后,如何继续保持这种联系?

2015-07-27 19:36:24 +08:00
 spencerqiu
现在能想到的办法就是在排序交换 a 数组的时候,同时把 b 数组也交换了...但是因为 STL 的 sort ...都多少年没有写过排序了...写个快排也真不轻松= =

所以还有别的办法么?依稀记得 struct 可能可以解决...有没有大神能给个示范?(先对a排序,然后让 a
和 b 一一对应)
831 次点击
所在节点    C
7 条回复
bazingaterry
2015-07-27 19:41:17 +08:00
依稀记得 sort() 可以有第二个参数的,你写一个比较函数就可以了。
zoudm
2015-07-27 19:47:22 +08:00
放在一个struct S里面,比如是一个int i和char c。然后你有一个S s[100];
然后两种办法:
1重载这个这个struct的小于号,bool operator < (const S & c) const { return i < c.i; }。然后使用sort来对其排序
2定义一个函数bool comp(S &a, S &b) { return a.i < b.i; } 然后在sort的时候使用sort(s, s+100, comp),作为第三个参数传comp这个函数进去。
bazingaterry
2015-07-27 19:58:23 +08:00
@bazingaterry 不好意思,是第三个参数。
二楼正解!
publicID001
2015-07-27 20:50:17 +08:00
pair自带比较,可直接sort
towser
2015-07-28 13:24:00 +08:00
与你头像相映成趣
morefreeze
2015-07-28 14:03:44 +08:00
struct node{ int a,b; };
node arr[100];
bool cmp(const node& lhs, const node& rhs){
return lhs.a < rhs.a;
}
sort(arr, arr+sizeof(arr)/sizeof(arr[0]), cmp);
canautumn
2015-07-28 15:00:21 +08:00
4楼正解,不需要函数指针和结构体,做成pair就行了

还有一种更通用的办法(超过2组数据,不需要额外的数据结构)就是取得数组a排序的index,然后任意数组按b[indexes[i]]来访问就行了:

double a[10]= {...};
double b[10]= {...};
int indexes[10];

std::iota(std::begin(indexes), std::end(indexes), 0);
std::sort(std::begin(indexes), std::end(indexes), [&a] (int i, int j) { return a[i] < a[j]; });

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208722

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX