【问题标题】:Dynamic, unpreditable sized array in CC中的动态,不可预测的大小数组
【发布时间】:2014-10-01 23:16:14
【问题描述】:

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

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

如果允许我用 C++ 编程,我会使用向量。不幸的是,我做不到,而且我想不出更好的主意。

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

【问题讨论】:

  • 没有办法估计数组的长度,但是你知道最大长度可能是多少(即是否有硬性限制)?
  • 不,我不...更糟糕的是,它是高度分布的。

标签: c arrays dynamic structure dynamic-arrays


【解决方案1】:

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

然后你可以做vector 会做的事情:当你需要重新分配时,将分配的大小加倍。这应该可以解决realloc 的性能问题。

【讨论】:

  • @downvoter:感谢您的反馈!你介意留下评论来教育我我所说的有什么问题吗?
  • cnicutar:问题标题和标签清楚地表明“C”而不是“C++”。您没有回答“这个”问题,因此投反对票。
  • @Adrian 我 am 回答了这个问题。我只是在说明一种在 C 中处理此问题的典型方法,它恰好模拟了用户对 C++ 的期望。我的回答中没有任何特定于 C++ 的内容。
【解决方案2】:

本文包含针对您的问题的完整解决方案。基本上它使用 C Implementing a dynamically sized array in C 实现了一个“矢量”类型的类

它像这样定义矢量类型:

// 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

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

动态数组与动态分配的数组不同 数组,它是一个固定大小的数组,当数组的时候它的大小是固定的 已分配,尽管动态数组可能会使用这种固定大小的数组 作为后端。

【讨论】:

  • @FiddlingBits 完整的解决方案在文章中。
  • 你需要在“动态”和“性能”之间做出妥协——天下没有免费的午餐
【解决方案3】:

实际上,没有比你建议的更好的主意了,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;
}

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2015-05-06
    • 2015-06-06
    • 2014-09-25
    • 2012-04-17
    相关资源
    最近更新 更多