使用向量在c ++中增加数组的大小

时间:2016-11-03 21:49:36

标签: c++ arrays

我正在为学校做作业,我们需要在不使用向量的情况下动态增加数组的大小。 这就是我所拥有的,但它不断清除这两个列表。

string name;
int numOfClasses = 1;
string *listOfCourses = new string[numOfClasses];
string studentclasses;

void addToList(string n,int i) {
    numOfClasses++;
    string *copyOfListOfCourses = new string[numOfClasses];
    memcpy(copyOfListOfCourses, listOfCourses, numOfClasses + 1);

    copyOfListOfCourses[i] = n;
    delete[] listOfCourses;
    listOfCourses = copyOfListOfCourses;


}

4 个答案:

答案 0 :(得分:6)

memcpy(copyOfListOfCourses, listOfCourses, numOfClasses + 1);

memcpy()是一个C库函数,它对C ++类,它们的构造函数或析构函数一无所知。它不能用于复制包含std::string的数组。此memcpy()还存在至少两个其他问题,除了它首先不能与std::string一起使用。

执行此操作的正确方法是使用C ++算法std::copy,或使用手动for循环。

#include <algorithm>

std::copy(listOfCourses, listOfCourses+(numOfClasses-1),
          copyOfListOfCourses);

请注意,此时numOfClasses是新数组的大小,它比现有数组的大小大1,因此正确的计算必须从numOfClasses中减去 1,获取现有数组的大小,而不是添加1。

另一个问题是:

copyOfListOfCourses[i] = n;

不是仅仅将整个现有数组复制到新数组,而是实际必须发生的是 另一个 副本来移动已调整大小的数组中的所有值,从索引#i的现有值开始增加1,为新值腾出空间。这将是第二次std::copy()调用,您现在应该能够自己弄明白。

答案 1 :(得分:1)

您可以创建一个新数组,将旧元素复制到新数组,然后用新数组替换旧数组。显然,使用指针。

假设您有一个指向名为int的{​​{1}}数组的指针,该数组是使用动态内存创建的:

arr

你想要调整它的大小,例如存储4个元素。

您将使用新大小创建指向名为int *arr = new int[3]; arr[0] = 1; arr[1] = 2; arr[2] = 3; 的新int数组的指针:

temp

现在将旧元素复制到新数组:

int *temp = new int[4];

现在您可以删除旧内存并将for (int i = 0; i < 3 ; i++) // 3 for the size of the old array { temp[i] = arr[i]; // copy the elements } 指向新内存:

arr

现在你可以这样做:

delete[] arr;
arr = temp;

答案 2 :(得分:1)

以下是您正在寻找的示例。 它会创建一个temporary_array,其大小要大一个单位,然后将my_array的内容复制到temporary_array中。然后将input_value添加到temporary_array的末尾,delete[]的my_array并将my_array分配给temporary_array。最后,它会为以后的函数调用增加old_array_size

int array_size = 1;
string *my_array = new string[array_size];

void add_to_array(string input_value, int &old_array_size) {

    int new_array_size = old_array_size + 1;

    string *temporary_array = new string[new_array_size];

    for(int i = 0; i < old_array_size; i++) {
        temporary_array[i] = my_array[i];
    }

    temporary_array[new_array_size - 1] = input_value;

    delete[] my_array;

    my_array = temporary_array;

    old_array_size++;

}

这可能不是专业人士想要做的,但是它在不使用std::vector的情况下回答了您的问题

答案 3 :(得分:-1)

试试这个

#include<iostream>
#include<string.h>
using namespace std;
int *a;
int nCurrentSize =0;
void pushBack(int n)
{
  if(0 == nCurrentSize)
   {
    a= new int[1+nCurrentSize];
    a[nCurrentSize] = n;
   nCurrentSize++;
   }
   else
   {
     int *tmp = new int[nCurrentSize];
     memcpy(tmp,a,nCurrentSize*sizeof(int));
     delete []a;
     a= new int[1+nCurrentSize];
     memcpy(a,tmp,nCurrentSize*sizeof(int));
     a[nCurrentSize] = n;
     delete []tmp;
   nCurrentSize++;
    }
}
void display()
{
for(int i=0;i<nCurrentSize; i++)
  cout<<a[i]<<",";
}

int main()
{
pushBack(91);
pushBack(5);
pushBack(3);
pushBack(7);
pushBack(1);
pushBack(3);
pushBack(2);
pushBack(2);
pushBack(0);
pushBack(5); 

display();
cout<<endl<<nCurrentSize;
}