我需要帮助。我的任务是创建一个typedef,它代表一个从0到127的数字数组。 数字不能重复 - 它是一组整数。
这不好,因为它消耗了太多数据:
typedef struct set{
char array[128];
}some_set;
以后这个数据结构将用于定义不同的集合(set_a,set_b,set_c等等),这些集合将用于不同的操作,如:
print_set which will print the set
union_set which combines 2 sets into 3rd set
intersect_set which will intersect 2 sets and save the data in the 3rd
这是用法的例子。
有人建议稍微代表每个数字,但我无法真正地围绕它。
答案 0 :(得分:2)
您不能仅使用typedef
。
鉴于此,任何包含至少128位的类型都足以实现此目的。例子:
typedef uint32_t intset[4]; // array
typedef struct {uint64_t data[2];} intset; // struct containing an array
typedef uint128_t intset; // built-in 128-bit integer type
除了typedef
之外,您还必须定义与数据结构一起使用的函数。例如:
void intset_init(intset *set);
void intset_add(intset *set, int n);
void intset_remove(intset *set, int n);
bool intset_check(intset *set, int n);
bool intset_is_empty(intset *set);
每个此类函数都应使用bit-fiddling来完成其工作。例如:
typedef uint32_t intset[4];
void intset_add(intset *set, int n)
{
(*set)[n / 32] |= (uint32_t)1 << (n % 32);
}
按值传递和返回数据结构可能更有效,而不是通过指针。如果你想要这个,你不能使用数组typedef
- 使用任何其他方便的。
typedef struct {uint64_t data[2];} intset;
intset intset_add(intset set, int n)
{
set.data[n / 64] |= (uint64_t)1 << (n % 64);
return set;
}