我正在为学校做作业,我们需要在不使用向量的情况下动态增加数组的大小。 这就是我所拥有的,但它不断清除这两个列表。
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;
}
答案 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;
}