可变大小的数组

时间:2015-06-08 22:08:14

标签: c arrays memory-management arraylist macros

我正在开发我的第一个大项目,我需要可变大小的数组(或者是巨型修复大小的数组,我基本上是在创建一种新的编程语言'所以是的')

我至少想要这些功能:

ARRAY_NEW(type, arr) // Or something else for the arguments: Be creative :)
ARRAY_FREE(arr)
ARRAY_PUSH(arr, item)
ARRAY_POP(arr)
ARRAY_SIZE(arr)
// Optional, but would increase performance
ARRAY_ADD(arr, index, item)
ARRAY_REMOVE(arr  index)
ARRAY_SPLIT(arr, index, length)
ARRAY_MAP(arr, lambda) // Macros suck? You suck!

我使用了几种方法来实现这些可变大小的数组:

用于为每个数组名称创建_length后缀的宏(我称之为ARRAY)

#define NEWARRAY(type, name) (type* name = NULL; size_t name ## _length = 0;)
NEWARRAY(int, array);

用于在数组中存储长度的宏 - 单元格 - 1其中单元格是存储size_t所需的单元格数量:(被称为ARRAYLIST)

char[] array:
0 0 0 1 4 97

将是一个长度为1且值为[' a']的数组(数组[0]将返回' a' with my implementation,这是我喜欢的) 注意:到目前为止,这是我唯一一个实现了ARRAY_ADD和ARRAY_REMOVE的数据类型

将所有数组存储在自定义数据类型中:( ARRAYTYPE怎么样?)

struct ArrayType {
    int length;
    void** values;
}

我目前正在尝试使用分块数组(每隔几个PUSHes分配一个新内存)(让我们称之为CHUNKEDARRAY,我认为它会存储长度,就像我使用ARRAYLIST一样。

我主要使用2,有时1(因为2是100%安全的,如果name_length已经被声明,1将失败(使它... 99%安全)我不会真正使用3 alot除非性能是一个问题,因为输入array.values [0]需要更多的时间来编写并且看起来更糟糕)

你能否给我一些关于使变量大小的数组更容易的技巧和诀窍?你用什么?对我目前的做法有何评论?是否有更多可变大小且可在C中实现的数据结构? 我现在已经用可变大小的数组了很长一段时间。

1 个答案:

答案 0 :(得分:0)

所有人的拳头都会有linked list。简单:

----------        ----------
- Data   -        - Data   -    
----------        ----------   
- Pointer- - - -> - Pointer-  
----------        ----------

但您也可以使用双链表。

然后会有一个heap数据结构。这些对于 O(log(n))时间内的sorting和/或数据访问非常有效。

您可以使用链接列表或堆作为简单数组的替代。您可以使用各种算法对它们进行排序。 O(n log(n))时间,它们在调整大小它们(添加/删除)时没有很多计算开销 - 这与经典数组,总是必须按照您可能已经知道的方式进行复制。

然后我的最爱: don't re-invent the wheel(特别是“”项目) - 数据结构或“ “就像有些人所说的那样。

当然还有hash - 地图/集合/表格也可能对 O(1)时间内的数据访问有用。