我想在数组中添加一个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 ++中我不能这样做,它给了我一个编译器错误。你们有什么建议?
答案 0 :(得分:64)
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
标头和std
命名空间中定义。要使用它,您应该:
#include <vector>
并且在代码中使用std::vector
或添加
using std::vector;
或
using namespace std;
在#include <vector>
行之后。
答案 1 :(得分:48)
使用普通数组无法在C ++中执行您所说的操作。 C ++解决方案是使用STL库为您提供std::vector
。
您可以这样使用vector
:
std::vector< int > arr;
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);
答案 2 :(得分:13)
使用矢量:
#include <vector>
void foo() {
std::vector <int> v;
v.push_back( 1 ); // equivalent to v[0] = 1
}
答案 3 :(得分:13)
int arr[] = new int[15];
变量arr
包含内存地址。在存储器地址处,连续有15个连续的整数。可以使用索引0到14(包括0和14)引用它们。
在php中我可以这样做arr [] = 22; 这将自动添加22到 数组的下一个空索引。
处理数组时没有'next'的概念 我认为您缺少的一件重要事情是,一旦创建了数组,阵列的所有元素都已存在。它们是未初始化的,但它们都已存在。因此,当你去的时候,你并没有“填充”数组的元素,它们已经被填充,只是未初始化的值。无法测试数组中未初始化的元素。
答案 4 :(得分:10)
你不必使用矢量。如果你想坚持使用普通数组,你可以这样做:
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个项目(或者您设置的最大值)。即使数组中只存储了1个项目,您也使用100个字节的内存。
这是其他人推荐载体的主要原因。在后台管理向量,并在结构扩展时分配新内存。在数据大小已知的情况下,它仍然不如阵列那么高效,但对于大多数目的而言,性能差异并不重要。每种方法都需要权衡,最好同时了解这两种方法。
答案 5 :(得分:6)
在实现动态数组时,我完全同意vector
方式。但是,请记住,STL为您提供了一系列满足不同运行时要求的容器。您应该谨慎选择。例如:要在后面快速插入,您可以选择vector
和deque
。
我几乎忘记了,强大的责任带来了很大的责任:-)由于vector
的大小很灵活,它们经常自动重新分配以调整添加元素。所以要注意迭代器失效(是的,它适用于好指点)。但是,只要您使用operator[]
来访问单个元素就是安全的。
答案 6 :(得分:2)
我可能在这里忽略了你的问题,如果是这样,我道歉。但是,如果您不打算删除任何仅添加它们的项目,为什么不简单地将变量分配给下一个空槽?每次向数组添加新值时,只需将值递增以指向下一个值。
在C ++中,更好的解决方案是使用标准库类型std::list< type >
,它也允许数组动态增长,例如:
#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);
答案 7 :(得分:2)
首先将所有数组元素初始化为null,然后查找null以查找空槽
答案 8 :(得分:1)
如果您使用C ++编写 - 使用标准库(如vector)中的数据结构会更好。
C风格的数组非常容易出错,应尽可能避免使用。
答案 9 :(得分:0)
您可以使用变量来计算数组中的位置,因此,无论何时添加新元素,都将其放置在正确的位置。例如:
int a = 0;
int arr[5] = { };
arr[a] = 6;
a++;
答案 10 :(得分:0)
#include <iostream>
#include <conio.h>
#include "windows.h"
using namespace std;
int main()
{
int arr [] = {1,2,3,4,5};
int len = sizeof(arr) / sizeof(arr[0]);
arr[len] = 6;
for(int i = 0; i < len; i++){
cout << arr[i] << " ";
}
getch();
return 0;
}
答案 11 :(得分:0)
int array arraySize = 25;
int array[arraySize];
array[0] = 3;
array[1] = 9;
array[2] = 27;
如果您将 arraySize 声明为 25,那么您添加的值不能超过 25。
答案 12 :(得分:-4)
好吧,如果您不初始化数组的长度,那么可以将元素添加到数组中。
int arr[] = {1,2,3,4,5};
int last_index = sizeof(arr)/sizeof(arr[0]);
arr[last_index] = 6;
新数组将包含从1到6的值