我有一个动态数组,其中包含方法 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
和一个 for-loop over array.buf
with array.num
我可以仍然可以访问最多 SIZE_MAX
个元素。 insert
和 delete
最多只能访问 INT_MAX
个元素,而 indexOf
无法返回超过 INT_MAX
。
您认为此实现是否正确,或者您将如何更改它?
size_t
pro:您最多可以有 SIZE_MAX
个元素
相反:您只能以有限的方式访问 INT_MAX
以上的部分
int
赞成:接口(interface)将与实现保持一致
contra:您不能以任何方式拥有超过 INT_MAX
个元素,而且 int
对象的大小也很不直观这就是 size_t
最佳答案
不要限制实现。将带有 size_t 参数的方法添加到接口(interface)。
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) {...}
关于c - 用于保存数据结构中元素计数的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27129025/