您不必使用向量。如果你想坚持使用普通数组,你可以这样做:
int arr[] = new int[15];
unsigned int arr_length = 0;
现在,如果你想在数组末尾添加一个元素,你可以这样做:
if (arr_length < 15) {
arr[arr_length++] = <number>;
} else {
// Handle a full array.
}
它不像 PHP 等价物那样简洁优雅,但它完成了您尝试做的事情。为了让您以后可以轻松更改数组的大小,您可以使用#define。
#define ARRAY_MAX 15
int arr[] = new int[ARRAY_MAX];
unsigned int arr_length = 0;
if (arr_length < ARRAY_MAX) {
arr[arr_length++] = <number>;
} else {
// Handle a full array.
}
这使得将来管理阵列变得更加容易。通过将 15 更改为 100,数组大小将在整个程序中正确更改。请注意,您必须将数组设置为最大预期大小,因为一旦编译程序就无法更改它。例如,如果您有一个大小为 100 的数组,则永远不能插入 101 个元素。
如果您要使用数组末尾的元素,您可以这样做:
if (arr_length > 0) {
int value = arr[arr_length--];
} else {
// Handle empty array.
}
如果您希望能够从一开始就删除元素(即 FIFO),则解决方案会变得更加复杂。您还需要一个开始和结束索引。
#define ARRAY_MAX 15
int arr[] = new int[ARRAY_MAX];
unsigned int arr_length = 0;
unsigned int arr_start = 0;
unsigned int arr_end = 0;
// Insert number at end.
if (arr_length < ARRAY_MAX) {
arr[arr_end] = <number>;
arr_end = (arr_end + 1) % ARRAY_MAX;
arr_length ++;
} else {
// Handle a full array.
}
// Read number from beginning.
if (arr_length > 0) {
int value = arr[arr_start];
arr_start = (arr_start + 1) % ARRAY_MAX;
arr_length --;
} else {
// Handle an empty array.
}
// Read number from end.
if (arr_length > 0) {
int value = arr[arr_end];
arr_end = (arr_end + ARRAY_MAX - 1) % ARRAY_MAX;
arr_length --;
} else {
// Handle an empty array.
}
在这里,我们使用模数运算符 (%) 来使索引换行。例如,(99 + 1) % 100 为 0(环绕增量)。并且 (99 + 99) % 100 是 98 (环绕减量)。这可以让您避免使用 if 语句并使代码更高效。
随着您的代码变得越来越复杂,您还可以快速看到#define 的帮助。不幸的是,即使使用此解决方案,您也永远无法在数组中插入超过 100 个项目(或您设置的任何最大值)。即使数组中只存储了一项,您也会使用 100 字节的内存。
这是其他人推荐向量的主要原因。一个向量在幕后进行管理,并随着结构的扩展分配新的内存。在数据大小已知的情况下,它仍然不如数组有效,但对于大多数用途而言,性能差异并不重要。每种方法都需要权衡取舍,最好两者都知道。