我想将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 ++中我无法做到这一点,它给了我一个编译器错误。你们有什么建议?
我想将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 ++中我无法做到这一点,它给了我一个编译器错误。你们有什么建议?
Answers:
在C ++中,用纯数组无法做到您所说的话。为此,C ++解决方案是使用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标头和std名称空间中定义。要使用它,您应该:
#include <vector>
而且,可以std::vector在您的代码中使用或添加
using std::vector;
要么
using namespace std;
后#include <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.
}
这使得将来管理阵列变得更加容易。通过将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字节的内存。
这是其他人推荐载体的主要原因。在后台管理矢量,并随着结构的扩展分配新的内存。在已知数据大小的情况下,它仍然不如数组有效,但是对于大多数目的而言,性能差异并不重要。每种方法都需要权衡取舍,最好两种都知道。
Array initializer must be an initializer list当您尝试int arr[] = new int[15];使用初始化数组的方法时,我得到一个相当一致的错误arr。
使用向量:
#include <vector>
void foo() {
std::vector <int> v;
v.push_back( 1 ); // equivalent to v[0] = 1
}
我在这里可能遗漏了您的问题,如果可以,我深表歉意。但是,如果您不打算删除任何项目而仅添加它们,为什么不简单地将变量分配给下一个空插槽呢?每次将新值添加到数组时,只需增加该值以指向下一个值即可。
在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);
由于我收到了很多负面反馈,因此我意识到我的解决方案是错误的,因此我进行了更改。
int arr[20] = {1,2,3,4,5};
int index = 5;
void push(int n){
arr[index] = n;
index++;
}
push(6)
新数组将包含从1到6的值,您也可以像这样使函数删除。
realloc。