C语言中大小不可修改的动态数组

C语言中大小不可修改的动态数组,c,arrays,dynamic,structure,dynamic-arrays,C,Arrays,Dynamic,Structure,Dynamic Arrays,我将创建一个结构值数组。 条目的数量取决于输入,因此无法估计数组的长度 在FOR循环中,解析输入,我将为每个迭代创建一个条目。 这意味着我需要重新分配阵列,因为阵列的大小会增加,这会导致性能方面的低效 如果允许我在C++中编程,我会使用向量。不幸的是我不能,我想不出更好的办法 请帮助我,任何建议都将不胜感激 如果允许我在C++中编程,我会使用向量。 然后,您可以做vector将要做的事情:当您需要重新分配时,将分配的大小增加一倍。这将摊销realloc性能问题 如果允许我在C++中编程,我会使用

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

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

如果允许我在C++中编程,我会使用向量。不幸的是我不能,我想不出更好的办法

请帮助我,任何建议都将不胜感激

如果允许我在C++中编程,我会使用向量。 然后,您可以做

vector
将要做的事情:当您需要重新分配时,将分配的大小增加一倍。这将摊销
realloc
性能问题

如果允许我在C++中编程,我会使用向量。


然后,您可以做
vector
将要做的事情:当您需要重新分配时,将分配的大小增加一倍。这应该会分期偿还性能问题。

本文为您的问题提供了一个完整的解决方案。基本上,它使用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);
关于堆栈溢出,已经回答了一些类似的问题,也请看一下:

编辑:维基百科上的信息帖子:

在计算机科学中,动态数组、可增长数组、可调整大小数组、, 动态表、可变数组或数组列表是随机访问, 允许添加或删除元素的可变大小列表数据结构 远离的。许多现代图书馆都提供标准图书馆 主流编程语言

动态数组与动态分配的数组不同 数组,它是一个固定大小的数组,当数组 虽然动态数组可以使用这种固定大小的数组,但 作为后端


本文为您的问题提供了完整的解决方案。基本上,它使用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);
关于堆栈溢出,已经回答了一些类似的问题,也请看一下:

编辑:维基百科上的信息帖子:

在计算机科学中,动态数组、可增长数组、可调整大小数组、, 动态表、可变数组或数组列表是随机访问, 允许添加或删除元素的可变大小列表数据结构 远离的。许多现代图书馆都提供标准图书馆 主流编程语言

动态数组与动态分配的数组不同 数组,它是一个固定大小的数组,当数组 虽然动态数组可以使用这种固定大小的数组,但 作为后端


实际上,没有更好的想法,你建议,C++ STD::向量在引擎盖下(也许是用更高级的估计算法)< /P> 你只需要像这样的东西

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;
}
typedef struct mystruct mystruct;
结构mystruct
{
//您的结构的成员
};
结构向量
{
mystruct*数组;
无符号维数;
未签字的填写;
};
void vector_init(结构向量*v,int初始大小)
{
v->尺寸=初始尺寸;
v->filled=0;
v->array=malloc(sizeof(mystruct)*初始大小);
}
void vector_add(结构向量*v,mystruct obj)
{
如果(v->dimfilled)
{
v->尺寸*=2;
realloc(v->array,v->dimension);
}
v->array[filled]=obj;
v->filled++;
}
int main()
{
结构向量*v;
向量_init(v);
mystruct struct_实例;
int i;

对于(i=0;i实际上没有更好的想法,你建议的,C++ +STD::向量在引擎盖下(这可能是用更高级的估计算法)< < /P> 你只需要像这样的东西

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;
}
typedef struct mystruct mystruct;
结构mystruct
{
//您的结构的成员
};
结构向量
{
mystruct*数组;
无符号维数;
未签字的填写;
};
void vector_init(结构向量*v,int初始大小)
{
v->尺寸=初始尺寸;
v->filled=0;
v->array=malloc(sizeof(mystruct)*初始大小);
}
void vector_add(结构向量*v,mystruct obj)
{
如果(v->dimfilled)
{
v->尺寸*=2;
realloc(v->array,v->dimension);
}
v->array[filled]=obj;
v->filled++;
}
int main()
{
结构向量*v;
向量_init(v);
mystruct struct_实例;
int i;

对于(i=0;无法估计数组的长度,但您知道最大长度可能是多少(即是否存在硬限制)?不,我不知道…更糟糕的是,它是高度分布的。无法估计数组的长度,但您知道最大长度可能是多少(即是否存在硬限制)?不,我不知道……更糟糕的是,它是高度分布式的。@FiddlingBits完整的解决方案在本文中。你需要在“动态”和“性能”之间做出折衷——没有免费的lunch@FiddlingBits完整的解决方案在本文中。您需要在“动态”和“性能”之间做出折衷-没有免费的lunch@downvoter:谢谢你的反馈!你介意留下评论来告诉我我说的有什么不对吗?cnicutar:问题标题和标签上清楚地写着“C”而不是“C++”。你不是在回答“这个”问题是,我回答了这个问题。我只是简单地说明了C中处理这个问题的一种典型方法,它恰好模仿了用户对C++的期望。我的回答中没有什么C++具体的。@下流:谢谢你的反馈!请你留下评论,告诉我我在什么地方出错了。d?cnicutar:问题标题和标签清楚地表明了“C”而不是“C++”。你没有回答“这个”问题,因此投了反对票。@Adrian我在回答这个问题。我只是简单地说明了处理这个问题的典型方法