我将创建一组结构值。 条目数取决于输入,因此无法估计数组的长度。
在FOR循环中,解析输入,我会为每次迭代创建一个条目。 这意味着我需要重新分配数组,因为大小增加,这导致性能效率低下。
如果我被允许用C ++编程,我会使用vector。不幸的是我不能,而且我想不出更好的主意。
请帮助我,我们将不胜感激。
答案 0 :(得分:5)
如果我被允许用C ++编程,我会使用vector。
然后你可以做vector
会做的事情:当你需要重新分配时,将分配的大小加倍。这应该摊销realloc
性能问题。
答案 1 :(得分:1)
本文包含针对您的问题的完整解决方案。基本上它使用C Implementing a dynamically sized array in C
实现“Vector”类型类它定义了这样的矢量类型:
// Define a vector type
typedef struct {
int size; // slots used so far
int capacity; // total available slots
int *data; // array of integers we're storing
} Vector;
void vector_init(Vector *vector);
void vector_append(Vector *vector, int value);
int vector_get(Vector *vector, int index);
void vector_set(Vector *vector, int index, int value);
void vector_double_capacity_if_full(Vector *vector);
void vector_free(Vector *vector);
Stack Overflow上已经回答了类似的问题,看看它们也是如此:
编辑:维基百科上的信息性帖子:Dynamic array
在计算机科学中,动态数组,可增长数组,可调整大小的数组, 动态表,可变数组或数组列表是随机访问, 可变大小的列表数据结构,允许添加元素或 除去。它提供许多现代标准库 主流编程语言。
动态数组与动态分配不同 数组,这是一个固定大小的数组,其大小在数组时是固定的 尽管动态数组可以使用这样的固定大小的数组,但是被分配 作为后端。
答案 2 :(得分:0)
实际上没有更好的想法,你所建议的,C ++ std :: vector在引擎盖下完成了这个(可能有更高级的估算算法)
你只需要像
这样的东西typedef struct mystruct mystruct;
struct mystruct
{
//Your struct's members
};
struct vector
{
mystruct* array;
unsigned dimension;
unsigned filled;
};
void vector_init(struct vector *v, int initial_size)
{
v->dimension=initial_size;
v->filled=0;
v->array= malloc(sizeof(mystruct)*initial_size);
}
void vector_add(struct vector *v, mystruct obj)
{
if(v->dim<=v->filled)
{
v->dimension*=2;
realloc(v->array, v->dimension);
}
v->array[filled] = obj;
v->filled++;
}
int main()
{
struct vector *v;
vector_init(v);
mystruct struct_instance;
int i;
for(i=0; i<whatever; i++)
{
insert_obj(array, struct_instance);
}
return 0;
}