如何将元素添加到C++数组?

r4c*_*oon 59 c++ arrays

我想在数组中添加一个int,但问题是我现在不知道索引是什么.

int[] arr = new int[15];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
Run Code Online (Sandbox Code Playgroud)

该代码有效,因为我知道我分配的索引,但如果我不知道索引怎么办...

在PHP中,我可以这样做arr[]=22;,它将自动将22添加到数组的下一个空索引.但是在C++中我不能这样做,它给了我一个编译器错误.你们有什么建议?

Meh*_*ari 68

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.
Run Code Online (Sandbox Code Playgroud)

正如评论中所提到的,vectorvector头文件和std名称空间中定义.要使用它,您应该:

#include <vector>

并且,std::vector在您的代码中使用或添加

using std::vector; 
Run Code Online (Sandbox Code Playgroud)

要么

using namespace std;
Run Code Online (Sandbox Code Playgroud)

之后#include <vector>.

  • 此外,在实例化之前使用std :: vector或使用std :: vector添加. (2认同)

jab*_*jab 58

使用普通数组无法在C++中执行您所说的操作.C++解决方案是使用STL库为您提供std::vector.

您可以这样使用vector:

std::vector< int > arr;

arr.push_back(1);
arr.push_back(2);
arr.push_back(3);
Run Code Online (Sandbox Code Playgroud)

  • 你需要"#include <vector>"!= d (5认同)

小智 13

使用矢量:

#include <vector>

void foo() {
    std::vector <int> v;
    v.push_back( 1 );       // equivalent to v[0] = 1
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*ndy 13

int arr[] = new int[15];
Run Code Online (Sandbox Code Playgroud)

该变量arr保存一个内存地址.在存储器地址处,连续有15个连续的整数.可以使用索引0到14(包括0和14)引用它们.

在php我可以这样做arr [] = 22; 这将自动将22添加到数组的下一个空索引.

在处理数组时没有'next'的概念.
我认为您缺少的一件重要事情是,一旦创建了数组,阵列的所有元素都已存在.它们是未初始化的,但它们都已存在.因此,当你去的时候,你并没有"填充"数组的元素,它们已经被填充,只是未初始化的值.无法测试数组中未初始化的元素.

听起来您想要使用数据结构,例如队列堆栈向量.


azo*_*ria 10

您不必使用向量.如果你想坚持使用普通数组,你可以这样做:

int arr[] = new int[15];
unsigned int arr_length = 0;
Run Code Online (Sandbox Code Playgroud)

现在,如果要在数组末尾添加元素,可以执行以下操作:

if (arr_length < 15) {
  arr[arr_length++] = <number>;
} else {
  // Handle a full array.
}
Run Code Online (Sandbox Code Playgroud)

它不像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.
}
Run Code Online (Sandbox Code Playgroud)

这使得将来管理阵列变得更加容易.通过将15更改为100,可以在整个程序中正确更改数组大小.请注意,您必须将数组设置为最大预期大小,因为编译程序后无法更改它.例如,如果您有一个大小为100的数组,则永远不能插入101个元素.

如果您将使用数组末尾的元素,则可以执行以下操作:

if (arr_length > 0) {
  int value = arr[arr_length--];
} else {
  // Handle empty array.
}
Run Code Online (Sandbox Code Playgroud)

如果您希望能够从头开始删除元素(即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.
}
Run Code Online (Sandbox Code Playgroud)

这里,我们使用模数运算符(%)来使索引换行.例如,(99 + 1)%100为0(换行增量).并且(99 + 99)%100是98(包装减量).这允许您避免if语句并使代码更有效.

您还可以快速了解#define对您的代码变得更加复杂有多大帮助.不幸的是,即使使用此解决方案,您也绝不能在数组中插入超过100个项目(或者您设置的最大值).即使阵列中只存储了1个项目,您也使用100个字节的内存.

这是其他人推荐载体的主要原因.在后台管理向量,并在结构扩展时分配新内存.在数据大小已知的情况下,它仍然不如阵列那么高效,但对于大多数目的而言,性能差异并不重要.每种方法都有权衡取舍,最好两者兼顾.

  • 我绝对是 C++ 的新手,但是当我尝试使用“int arr[] = new int[15];”初始化数组“arr”的方法时,我得到了一个非常一致的“数组初始值设定项必须是初始值设定项列表”错误。 (2认同)

dir*_*tly 6

我完全同意vector实现动态数组的方式.但是,请记住,STL为您提供了一系列满足不同运行时要求的容器.您应该谨慎选择.例如:为了在后面快速插入,您可以选择a vector和a deque.

我几乎忘记了,强大的责任带来了很大的责任:-)因为vectors的大小很灵活,所以它们经常自动重新分配以调整添加元素.所以要注意迭代器失效(是的,它也适用于指针).但是,只要您使用它operator[]来访问单个元素,您就是安全的.