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

问题描述 投票:-2回答:4

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

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;


}
c++ arrays
4个回答
6
投票
memcpy(copyOfListOfCourses, listOfCourses, numOfClasses + 1);

memcpy()是一个C库函数,它对C ++类,它们的构造函数或析构函数一无所知。它不能用于复制包含std::strings的数组。这个memcpy()还有至少另外两个问题,除了它首先不能与std::strings一起使用的事实。

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

#include <algorithm>

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

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

另一个问题是:

copyOfListOfCourses[i] = n;

而不是仅仅将整个现有数组复制到新数组,而是真正必须发生的是另一个副本,用于调整已调整大小的数组中的所有值,从索引#i的现有值开始增加1,以便为新的价值。这将是第二次std::copy()电话,你现在应该能够自己弄清楚。


1
投票

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

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

int  *arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

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

您将使用新大小创建一个指向名为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;

现在你可以这样做:

arr[3] = 4;

1
投票

这是一个可能是你正在寻找的例子。它创造了一个大小为一个单位的temporary_array,将my_array的内容复制到temporary_array。然后将input_value添加到temporary_array的末尾,delete[]s 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的情况下回答了你的问题


-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;
} 
© www.soinside.com 2019 - 2024. All rights reserved.