我有一个包含19个变量的结构,我需要使用不同的排序算法来对这个结构进行排序,事实是它可以通过任何这些变量进行排序.我想知道是否有任何方法可以动态访问结构中的这些数据,这样我就可以编写一个方法来进行排序,而不是编写19个不同的方法来运行相同的排序算法但是在内部的不同变量上.
所以我有我的结构
struct team_stats{ float yards_per_game; int total_points; etc etc team_stats* arr = new team_stats[32];
我想做这样的事情(显然它不会是一个字符串因为这没有意义,但只是这背后的想法):
quickSort(arr,"yards_per_game"); // sorts by yards per game quickSort(arr,"total_points"); // sorts by total points quickSort(team_stats* arr,string field) { while (i <= j) { while (arr[i].field < pivot) etc. etc.
而不是像这样做:
if (field == "yards_per_game") quickSortYards(arr); else if (field == "total_points") quickSortPoints(arr); quickSortYards(team_stats* arr) { while (i <= j) { while (arr[i].yards_per_game < pivot) etc. etc. quickSortPoints(team_stats* arr) { while (i <= j) { while (arr[i].total_points < pivot) etc. etc.
因为后者要求我必须编写38个不同的函数,仅用于使用一种算法进行排序,我觉得这只是一团糟
谢谢
解决方法
如果您的所有数据字段具有相同的类型,则可以使用纯粹的
pointers-to-members并且不使用模板来实现.
但是,看起来您对不同的字段有不同的类型.在这种情况下,模板是最简单的方法.例如,您可以使用这样的东西
template <typename T,typename M> void sort_by_field(T a[],size_t n,const M T::*p) { std::sort(a,a + n,[p](const T &l,const T &r) { return l.*p < r.*p; }); } struct S { int a; float b; }; int main() { S s[100] = { ... }; sort_by_field(s,100,&S::a); sort_by_field(s,&S::b); }
很容易更新上面的sort_by_field函数来接受自定义比较器,而不是硬编码的< lambda里面的比较. 在上面的sort_by_field版本中,我使指针成员p成为正常的运行时函数参数.也可以使它成为编译时模板参数.这只是在代码的运行时参数化(更慢,但代码膨胀更少)和编译时参数化(更快,但更多代码膨胀)之间找到适当平衡的问题. 也可以完全不使用模板,使用纯运行时参数化,通过使用字节偏移替换指向成员的指针并使用qsort样式的比较器回调来实现它.但这将成为一个更具参与性和最强硬的C风格解决方案.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。