我想在数组中添加一个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)
正如评论中所提到的,vector在vector头文件和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>.
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)
小智 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个字节的内存.
这是其他人推荐载体的主要原因.在后台管理向量,并在结构扩展时分配新内存.在数据大小已知的情况下,它仍然不如阵列那么高效,但对于大多数目的而言,性能差异并不重要.每种方法都有权衡取舍,最好两者兼顾.
我完全同意vector实现动态数组的方式.但是,请记住,STL为您提供了一系列满足不同运行时要求的容器.您应该谨慎选择.例如:为了在后面快速插入,您可以选择a vector和a deque.
我几乎忘记了,强大的责任带来了很大的责任:-)因为vectors的大小很灵活,所以它们经常自动重新分配以调整添加元素.所以要注意迭代器失效(是的,它也适用于指针).但是,只要您使用它operator[]来访问单个元素,您就是安全的.