加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读