我正在开发我的第一个大项目,我需要可变大小的数组(或者是巨型修复大小的数组,我基本上是在创建一种新的编程语言'所以是的')
我至少想要这些功能:
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中实现的数据结构? 我现在已经用可变大小的数组了很长一段时间。
答案 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)时间内的数据访问有用。