c – 使用变量访问Struct中的任何数据?

我有一个包含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风格解决方案.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...