用于保存数据结构中元素计数的数据类型

时间:2014-11-25 14:15:56

标签: c arrays count int size-t

我有一个动态数组,其方法为pushpop,并且可以直接访问缓冲区。 直观地,我创建了包含数组包含size_t的元素数的字段。现在我添加insertdeleteindexOf等方法。

然而,前两个期望int作为位置使用负指数从后面选择元素,indexOf要么返回找到的位置,要么返回-1表示失败,导致:

struct array {
    size_t num;
    char *buf;
}

void array_push(char c) {...}
char array_pop() {...}
void array_insert(int pos, char c) {...}
void array_delete(int pos) {...}
int array_indexOf(char c) {...}

使用push / poparray.buf以及array.num的for循环,我仍然可以访问最多SIZE_MAX个元素。 insertdelete最多只能访问INT_MAX个元素,并且indexOf无法返回INT_MAX以上的位置。

您认为此实施方案是否正确或您将如何更改?

size_t

pro :您最多可以拥有SIZE_MAX元素

contra :您只能以有限的方式访问INT_MAX上方的部分

int

pro :界面与实现一致

contra :你不能以任何方式拥有超过INT_MAX个元素,对于一个对象的大小,int也是不正确的,因为size_t的目的是{{ 1}}

2 个答案:

答案 0 :(得分:1)

在我看来,在您的情况下,更自然地保留size_t并使用ptrdiff_t而不是int作为函数参数和返回值。您可以在stddef.h中找到它,顾名思义,它可用于数组索引和地址算法。

请注意,虽然ptrdiff_t是减去两个指针的结果,但这并不保证它在执行此操作时不会溢出。因此,当您处理非常大的对象时,它可能会导致问题,在这种情况下,使用指定宽度的整数类型可能会更好,例如int_fast64_t

答案 1 :(得分:1)

不要限制实施。将size_t参数的方法添加到接口。

void array_insert_beg(size_t pos, char c) {...}
void array_insert_end(size_t pos, char c) {...}
...
bool array_find(char c, size_t *index) {...}