c – 使用变量访问Struct中的任何数据?
发布时间:2020-12-16 10:01:50 所属栏目:百科 来源:网络整理
导读:我有一个包含19个变量的结构,我需要使用不同的排序算法来对这个结构进行排序,事实是它可以通过任何这些变量进行排序.我想知道是否有任何方法可以动态访问结构中的这些数据,这样我就可以编写一个方法来进行排序,而不是编写19个不同的方法来运行相同的排序算法
我有一个包含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风格解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |