如何将元素添加到C ++数组?
我想添加一个int到数组中,但问题是我不知道索引是什么。
int[] arr = new int[15]; arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5;
该代码的作品,因为我知道我分配了什么索引,但如果我不知道索引…
在PHP中,我只能做arr[]=22;
,它会自动将22添加到数组的下一个空索引。 但在C + +我不能这样做,它给了我一个编译器错误。 你们有什么build议?
没有办法在C ++中用普通数组来做你所说的话。 C ++解决scheme是通过使用STL库,它提供了std::vector
。
你可以用这种方式使用一个vector
:
std::vector< int > arr; arr.push_back(1); arr.push_back(2); arr.push_back(3);
C ++中的数组在运行时不能改变大小。 为此,应该使用vector<int>
来代替。
vector<int> arr; arr.push_back(1); arr.push_back(2); // arr.size() will be the number of elements in the vector at the moment.
正如评论中所提到的, vector
是在vector
header和std
namespace中定义的。 要使用它,你应该:
#include <vector>
也可以在代码中使用std::vector
或添加
using std::vector;
要么
using namespace std;
在#include <vector>
行之后。
使用vector:
#include <vector> void foo() { std::vector <int> v; v.push_back( 1 ); // equivalent to v[0] = 1 }
int arr[] = new int[15];
variablesarr
保存一个内存地址。 在内存地址中,连续有15个连续的整数。 它们可以用索引0到14来引用。
在PHP中,我可以做这个arr [] = 22; 这会自动将22添加到数组的下一个空索引。
处理数组时没有“下一个”的概念。
我认为你所缺less的一件重要的事情是,一旦数组被创build,数组的所有元素都已经存在。 他们是未初始化的,但他们都已经存在。 所以你不是在填充数组的元素,他们已经被填充,只是未初始化的值。 没有办法testing数组中的未初始化元素。
这听起来像你想要使用数据结构,如队列或堆栈或向量 。
你不必使用vector。 如果你想坚持简单的数组,你可以做这样的事情:
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. }
这使得将来pipe理arrays变得更容易。 通过改变15到100,数组大小将在整个程序中正确地改变。 请注意,您将不得不将数组设置为最大预期大小,因为一旦程序编译完毕就无法更改。 例如,如果您有一个大小为100的数组,则永远不能插入101个元素。
如果您将使用数组末尾的元素,则可以这样做:
if (arr_length > 0) { int value = arr[arr_length--]; } else { // Handle empty array. }
如果您希望能够从头开始删除元素(即FIFO),则解决scheme将变得更加复杂。 您还需要一个开始和结束索引。
#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的帮助。 不幸的是,即使使用这个解决scheme,也不能在数组中插入超过100个项目(或者设置的最大值)。 即使只有一个项目存储在数组中,也正在使用100个字节的内存。
这是其他人推荐载体的主要原因。 vector在幕后进行pipe理,并在结构展开时分配新内存。 在数据大小已知的情况下,它仍然不如arrays有效,但对于大多数目的而言,性能差异并不重要。 每种方法都有权衡,最好两方面都知道。
我完全同意实现dynamic数组时的vector
方式。 但是,请记住,STL为您提供了许多符合不同运行时要求的容器。您应该谨慎select一个容器。 例如:为了在后面快速插入,你可以select一个vector
和一个deque
。
而且我几乎忘记了,拥有巨大的力量将会带来很大的责任:-)由于vector
的大小是灵活的,他们通常会自动重新分配来调整添加元素。所以要小心迭代器失效(是的,它也适用于指针)。 但是,只要您使用operator[]
来访问各个元素,就是安全的。
将所有数组元素初始化为null,然后查找null以查找空槽
如果您使用C ++编写程序 – 使用标准库(如vector)的数据结构更好。
C风格的数组非常容易出错,应尽可能避免。
我可能会在这里错过你的问题,如果是的话,我表示歉意。 但是,如果你不打算删除任何项目只添加它们,为什么不简单地分配一个variables到下一个空的插槽? 每当你给数组添加一个新的值时,只需增加一个值到下一个值即可。
在C ++中,更好的解决scheme是使用标准库typesstd::list< type >
,它也允许数组dynamic增长,例如:
#include <list> std::list<int> arr; for (int i = 0; i < 10; i++) { // add new value from 0 to 9 to next slot arr.push_back(i); } // add arbitrary value to the next free slot arr.push_back(22);