微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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风格解决方案.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐