我有一个动态数组,其方法为push
,pop
,并且可以直接访问缓冲区。
直观地,我创建了包含数组包含size_t
的元素数的字段。现在我添加insert
,delete
和indexOf
等方法。
然而,前两个期望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
/ pop
和array.buf
以及array.num
的for循环,我仍然可以访问最多SIZE_MAX
个元素。 insert
和delete
最多只能访问INT_MAX
个元素,并且indexOf
无法返回INT_MAX
以上的位置。
您认为此实施方案是否正确或您将如何更改?
size_t
pro :您最多可以拥有SIZE_MAX
元素
contra :您只能以有限的方式访问INT_MAX
上方的部分
int
pro :界面与实现一致
contra :你不能以任何方式拥有超过INT_MAX
个元素,对于一个对象的大小,int
也是不正确的,因为size_t
的目的是{{ 1}}
答案 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) {...}