c++ - 如何将数组中的值复制到新数组中?

标签 c++ arrays pointers allocation

我已经断断续续地尝试解决这个问题一个星期了,但我一直遇到问题。

我的目标:

编写一个为整数数组分配内存的函数。该函数将整数指针、数组大小和要分配的 newSize 作为参数。该函数返回指向已分配缓冲区的指针。首次调用该函数时,大小将为零并创建一个新数组。如果在数组大小大于零时调用该函数,将创建一个新数组并将旧数组的内容复制到新数组中。您的讲师已提供 arrayBuilder.cpp 作为此编程挑战的起始代码。此外,Lab9_1.exe 是您可以测试的此应用程序的可执行文件。

代码:

#include <iostream>
using namespace std;

int * arrayBuilder(int * arr, int size, int newSize);
void showArray(int * arr, int size);

int main()
{
int * theArray = 0;
int i;

cout << "This program demonstrates an array builder function." << endl << endl;

// create the initial array.  The initial size is zero and the requested size is 5.
theArray = arrayBuilder(theArray, 0, 5);

// show the array before values are added
cout << "theArray after first call to builder: " << endl;
showArray(theArray, 5);

// add some values to the array
for(int i = 0; i < 5; i++)
{
    theArray[i] = i + 100;
}

// show the array with added values
cout << endl << "Some values stored in the array: " << endl;
showArray(theArray, 5);

// expand the size of the array.  size is not the original size.  newSize
// must be greater than size.
theArray = arrayBuilder(theArray, 5, 10);

// show the new array with the new size
cout << endl << "The new array: " << endl;
showArray(theArray, 10);

cout << endl;

delete [] theArray; // be sure to do this a1t the end of your program!

system("pause");

return 0;
}

/*
FUNCTION: arrayBuilder
INPUTS Pointer to an array.  Size of the array. If size is zero, arr can be    NULL.
      Size of the new array.
OUTPUTS:  Returns a pointer to allocated memory.  If newSize is greater than size,
      an array of newSize is allocated and the old array is copied into the new
      array. Memory pointed to by the old array is deleted.  All new elements
      are initialized to zero.
*/


int * arrayBuilder(int * arr, int size, int newSize)
{
// TODO: Your code goes here


return NULL; // default return value.  No memory allocated!
}

/*
FUNCTION: showArray
INPUTS: Pointer to an array.  Size of the array. If size is zero, arr can be  NULL.
OUTPUTS:  Prints the contents of the array to the console.
*/


void showArray(int * arr, int size)
{
cout << "arr = ";

for(int i = 0; i < size; i++)
{
    cout << arr[i] << "  ";
}

cout << endl;

}

我的挣扎:我不知道如何切换“arr”和临时数组的值。

int * arrayBuilder(int * arr, int size, int newSize)
{
// TODO: Your code goes here
    int * temp = new int [newSize];

for (int i = size; i < newSize; i++)
{
        *arr = *temp;
        temp++;
}

return NULL; // default return value.  No memory allocated!
}

搜索答案时的另一次尝试:

int * arrayBuilder(int * arr, int size, int newSize)
{
// TODO: Your code goes here
int * temp = new int [newSize];
memcpy (temp, arr, size *sizeof(int));
// HINT: Design the function before writing it.
delete[]  arr;

for (int i = size; i < newSize; i++)
{
    temp[i] = i;
}

return NULL; // default return value.  No memory allocated!
}

基本上我的最终目标是让答案看起来像这样:

This program demonstrates an array builder function.

theArray after first call to the builder:
arr = 0 0 0 0 0

some values stored in the array:
arr = 100 101 102 103 104

the new array:
arr = 100 101 102 103 104 0 0 0 0 0

进步!!它不再崩溃 :-) 这就是我现在所在的位置:

This program demonstrates an array builder function.

theArray after first call to builder:
arr = -842150451  0  0  0  0

Some values stored in the array:
arr = 100  101  102  103  104

The new array:
arr = -842150451  -842150451  -842150451  -842150451  -842150451  -842150451  -8
42150451  -842150451  -842150451  -842150451

Press any key to continue . . .

我会继续修补,如果我遇到了问题,请告诉大家!再次感谢大家!

好的!终于让它正常显示了:

This program demonstrates an array builder function.

theArray after first call to the builder:
arr = 0 0 0 0 0

some values stored in the array:
arr = 100 101 102 103 104

the new array:
arr = 100 101 102 103 104 0 0 0 0 0

我就是这样做的。当我为“温度”输入 0 值时,我觉得我可能在第二部分作弊了。据我了解,我打算从以前的数组中获取数据并将其放入新数组中,而我只是重新制作了它。 (因此它只适用于这组特定的值 [仅 0])。有没有一种不同的方法可以让我对第二部分进行编码,以便它可以普遍适用于抛出的任何值???

int * arrayBuilder(int * arr, int size, int newSize)
{
int i = size;
int * temp = new int [newSize];
// What if the size is 0?
if (size <= 0)
{
    while (i < newSize)
    {
        temp[i] = 0;
        i++;
    }
}
// Assuming the size _isn't_ 0
else 
{
// "a new array will be created"  (good)

for (i = 0; i < newSize; i++)
{
    // The contents of the "old" array (arr) will be
    // copied into the "new" array (temp)
    while (i < size)
    {
        temp[i] = arr[i];
        i++;
    }
    while (i >= size && i < newSize)
    {
        temp[i] = 0;
        i++;
    }
    // as a hint, you can address the elements in 
    // both arrays using the [] operator:
    // arr[i]
    // temp[i]

}
}

// "The function returns a pointer to the allocated buffer."
// So, NULL is wrong, what buffer did you allocate?
return temp; // default return value.  No memory allocated!
}

最佳答案

因为你付出了一些努力。

Write a function that allocates memory for an integer array.

此函数的原型(prototype)已为您提供:

int * arrayBuilder(int * arr, int size, int newSize);

The function takes as an argument an integer pointer, the size of the array, and newSize to be allocated. The function returns a pointer to the allocated buffer.

这并没有说明对“旧”(传入)数组做任何事情,所以我们应该假设它需要单独保留。

When the function is first called, the size will be zero and a new array will be created.

根据上下文,以上文字毫无意义。随时告诉你的导师我是这么说的。如果大小为零,您如何知道要分配多少元素?

If the function is called when the array size is greater than zero, a new array will be created and the contents of the old array will be copied into the new array.

好的,现在是需要完成的事情的胆量(你如此接近)

int * arrayBuilder(int * arr, int size, int newSize)
{
    // What if the size is 0?

    // Assuming the size _isn't_ 0
    // "a new array will be created"  (good)
    int * temp = new int [newSize];

    for (int i = size; i < newSize; i++)
    {
        // The contents of the "old" array (arr) will be
        // copied into the "new" array (temp)

        // as a hint, you can address the elements in 
        // both arrays using the [] operator:
        // arr[i]
        // temp[i]

        // something is wrong here...
        *arr = *temp;

        // you definitely _don't_ want to do this
        temp++;
    }

    // "The function returns a pointer to the allocated buffer."
    // So, NULL is wrong, what buffer did you allocate?
    return NULL; // default return value.  No memory allocated!
}

关于c++ - 如何将数组中的值复制到新数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20409931/

相关文章:

c - int *p=somearray 但 (p+1) 不等于 somearray[1] 的地址。为什么?

java - 如何将 MySQL 查询存储到 Java 数组中?

java - 访问 Object[] 数组成员的方法

arrays - 在另一个数组中查找一个数组的值范围

c - 不兼容的整数到指针转换将 'char' 传递给类型 'const char *' 的参数

c++ - 如何使用 Boost(Lambda?)使 std::sort() 更容易?

c++ - 填充静态 unordered_map 局部变量

c++ - 有没有办法从此 sql 语句和逻辑中删除 select count(*)

c++ - 对迭代器进行操作的函数的每个容器优化

c 指针作为输入