Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting glib:按多个属性排序_Sorting_Glib - Fatal编程技术网

Sorting glib:按多个属性排序

Sorting glib:按多个属性排序,sorting,glib,Sorting,Glib,我正在使用glib进行排序: gint cmp_values_by_attr1(gpointer a, gpointer b) { my_strcut *seq_a = *((my_strcut**) a); my_strcut *seq_b = *((my_strcut**) b); return (seq_a->attr1 - seq_b->attr1); } values = g_ptr_array_sized_new(4); v = new_struct()

我正在使用glib进行排序:

gint cmp_values_by_attr1(gpointer a, gpointer b) {
   my_strcut *seq_a = *((my_strcut**) a);
   my_strcut *seq_b = *((my_strcut**) b);
   return (seq_a->attr1 - seq_b->attr1);
}
values = g_ptr_array_sized_new(4);
v = new_struct();
g_ptr_array_add(values, v);
...
g_ptr_array_sort(values, (GCompFunction) cmp_values_by_attr1);

现在在我的数组中,我想先按
attr1
排序,然后按
attr2
排序。如何实现?

比较函数返回小于、等于或大于零非常简单,这取决于第一个值是小于、等于还是大于第二个值。您只需比较第一个属性,如果返回值不等于零,则返回结果,否则比较第二个属性并返回结果:

gint comp_values (gpointer a, gpointer b) {
  gint res;
  my_strcut *seq_a = *((my_strcut**) a);
  my_strcut *seq_b = *((my_strcut**) b);

  res = seq_a->attr1 - seq_b->attr1;
  if (res == 0) {
    res = (seq_a->attr2 - seq_b->attr2);
  }
  return res;
}

我使用了一些“黑客”来实现这种排序

  • 将要排序的两个属性设置为
    uint32\t
    类型
  • 将排序的另一个属性
    uint64\u t
    添加到我的结构中
  • 将排序的
    的上32位移位为
    attr1
  • _sort
    低位32位为
    attr2
  • 对数组进行排序对于_Sort
    ,项目首先按
    attr1
    排序,然后按
    attr2
    排序
我已经实施并验证了它的有效性

缺点:

  • 要添加
    以进行排序的额外内存
  • 额外处理
  • 如果排序属性属于其他类型,则需要相应更改

请尝试进一步充实您的答案。仅仅发布一个代码块而没有任何解释或上下文是不好的。在当前状态下,您的答案可能对其他寻求此问题答案的人没有多大用处。这对无符号整数有效,但对有符号整数无效。