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

时间:2009-04-16 12:05:44

标签: c++ arrays

我想在数组中添加一个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 ++中我不能这样做,它给了我一个编译器错误。你们有什么建议?

13 个答案:

答案 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.

如评论中所述,vectorvector标头和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'的概念 我认为您缺少的一件重要事情是,一旦创建了数组,阵列的所有元素都已存在。它们是未初始化的,但它们都已存在。因此,当你去的时候,你并没有“填充”数组的元素,它们已经被填充,只是未初始化的值。无法测试数组中未初始化的元素。

听起来您想要使用queuestackvector等数据结构。

答案 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为您提供了一系列满足不同运行时要求的容器。您应该谨慎选择。例如:要在后面快速插入,您可以选择vectordeque

我几乎忘记了,强大的责任带来了很大的责任:-)由于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的值