我想将一个整数添加到一个数组中,但问题是我不知道现在的索引是什么。
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[] arr = new int[15];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
那份代码的运行是因为我知道要分配给哪个索引,但如果我不知道索引呢...
在PHP中,我可以直接使用arr[]=22;
,它会自动将22添加到数组的下一个空索引。但在C++中,我不能这样做,它会给我一个编译器错误。你们有什么建议吗?
C++ 中的纯数组无法实现您所说的功能。C++ 中解决这个问题的方法是使用STL库,它提供了 std::vector
。
您可以按照以下方式使用 vector
:
#include <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字节的内存。
这就是为什么其他人推荐使用向量的主要原因。向量在后台进行管理,并在结构体扩展时分配新的内存。在数据大小已知的情况下,它仍然不如数组高效,但对于大多数情况下,性能差异将不重要。每种方法都有权衡,最好了解两种方法。
int arr[] = new int[15];
数组初始化方法时,经常会出现“数组初始化器必须是初始化列表”的错误。 - Yu Chen#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 a = 0;
int arr[5] = { };
arr[a] = 6;
a++;
首先将数组的所有元素初始化为null,然后查找null以找到空槽位。
如果你在写C++代码,最好使用标准库中的数据结构,例如vector。
C风格的数组非常容易出错,应尽可能避免使用。