C语言中动态,不可预测的大小数组

时间:2014-08-08 12:58:39

标签: c arrays dynamic structure dynamic-arrays

我将创建一组结构值。 条目数取决于输入,因此无法估计数组的长度。

在FOR循环中,解析输入,我会为每次迭代创建一个条目。 这意味着我需要重新分配数组,因为大小增加,这导致性能效率低下。

如果我被允许用C ++编程,我会使用vector。不幸的是我不能,而且我想不出更好的主意。

请帮助我,我们将不胜感激。

3 个答案:

答案 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;
}