如何将数组复制到更大的数组中,并在未使用的空间中添加零?C++
How to copy array into bigger array and add zeros into unused space? C++
C++
我正在制作一个程序,向用户询问一个数字,将该数字设置为第一个数组的大小,然后根据大小向用户询问数字。然后它请求另一个数组大小,并将其设置为第二个数组大小。如果第二个数组的大小大于第一个,我需要将第一个数组复制到第二个,并将0添加到未使用的空格中。
例如,输出应该看起来像:
Enter first array size: 3
Enter a number: 45
Enter a number: 54
Enter a number: 65
45 54 65 // First array printed out
Enter second array size: 10
45 54 65 0 0 0 0 0 0 0 // Second array printed out
如果第二个数组更大,我需要帮助将0添加到未使用的空间中。
此外,我不确定如何复制数组是否是最好的方法。
代码段:
int *secondArray = new int[secondSize]; // Create array
for(int j = 0; j < secondSize; ++j)
{
secondArray[j] = firstArray[j]; // Set second array equal to first array
if (secondSize > firstSize)
{
// ?
}
}
就这么简单(但请注意,j
在代码中取代了secondSize
(——
if (j >= firstSize)
{
secondArray[j] = 0;
}
编辑:请参阅@Fred Larson在下面关于避免重复分配的评论。这是一个时髦的版本:
secondArray[j] = (j >= firstSize) ? 0 : firstArray[j];
如果secondSize大于firstSize,您的代码片段将从不存在的firstArray复制数据。
不要将if语句放入循环中。那是浪费时间。
试试这个:
size_t i;
if(firstSize < secondSize) {
for(i=0; i<firstSize; ++i)
secondArray[i] = firstArray[i];
for(;i<secondSize; ++i)
secondArray[i] = 0;
} else {
for(i=0; i<secondSize; ++i)
secondArray[i] = firstArray[i];
}
未经测试,但我很确定这是正确的方法。
如果使用标准类std::vector
而不是动态分配的数组,会更简单
以下是如何使用动态分配的数组和使用类std::vector
来完成任务的示例。您可以在两块代码中选择您需要的内容。
#include <iostream>
#include <vector>
#include <cstring>
int main()
{
{
std::cout << "Enter first array size: ";
size_t n1 = 0;
std::cin >> n1;
int *a1 = new int[n1]();
for ( size_t i = 0; i < n1; i++ )
{
std::cout << "Enter a number: ";
std::cin >> a1[i];
}
std::cout << "Enter second array size: ";
size_t n2 = 0;
std::cin >> n2;
int *a2 = new int[n2]();
std::memcpy( a2, a1, ( n2 < n1 ? n2 : n1 ) * sizeof( int ) );
for ( size_t i = 0; i < n2; i++ ) std::cout << a2[i] << ' ';
std::cout << std::endl;
delete [] a1;
delete [] a2;
}
{
std::cout << "Enter first array size: ";
std::vector<int>::size_type n1 = 0;
std::cin >> n1;
std::vector<int> v1( n1 );
for ( std::vector<int>::size_type i = 0; i < n1; i++ )
{
std::cout << "Enter a number: ";
std::cin >> v1[i];
}
std::cout << "Enter second array size: ";
std::vector<int>::size_type n2 = 0;
std::cin >> n2;
std::vector<int> v2( v1.begin(), v1.begin() + ( n2 < n1 ? n2 : n1 ) );
v2.resize( n2 );
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
}
return 0;
}
我建议使用STL向量,因为它们将自动处理内存管理(请参阅std::vector(。但是,如果您出于任何原因不得不使用数组,我建议您使用以下更类似的方法:
int *secondArray = new int[secondSize]; // Create array
//Initialize secondArray to 0
for(int i = 0; i < secondSize; i++) secondArray[i] = 0;
//Then use your code
for(int j = 0; j < secondSize; ++j)
{
secondArray[j] = firstArray[j]; // Set second array equal to first array
}
这不会检查secondSize<firstSize。您可能需要在分配内存之前添加一个检查,或者类似的操作。
您还可以创建第二个数组,并将其所有元素设置为0:
int* secondArray = new int[secondSize];
memset(secondArray, 0, sizeof(int) * secondSize);
然后你只需复制第二个的第一个元素中的第一个数组
for(int j = 0; j < firstSize; ++j)
{
secondArray[j] = firstArray[j]; // Set second array equal to first array
}
这是假设secondSize总是大于firstSize。
相关文章:
- 数组不会存储超出第一个空间的范围
- 将数组类型更改为 Int16 会节省存储空间吗?
- 这两个代码之间的差异(为什么我的数组也有额外的空间,即使我限制了它)
- 为多维数组创建内存空间
- 从数组中添加值并插入空间
- 字符串的变体数组包含替代空间
- 读取文件中的数字数量无限,存储在数组中(无空间)
- 动态分配缓冲空间为二维数组 - 为什么失败
- 赋值运算符复制数组中除可用空间之外的所有内容
- C++在具有O(n)空间的数组中查找第一个非重复整数
- 如何为字符串数组实例变量动态分配空间
- 数组的指针,该数组的每个元素的内存空间信息存储在哪里
- 如何将一个巨大的二维数组初始化为类中的空间
- 删除数组中的对象,并通过让其他数组对象相应地向左移动来摆脱空数组空间
- 为什么C++为我的动态数组分配这么大的内存空间
- 看似有效的算法,用于在不浪费空间的情况下将二叉搜索树存储在数组中
- 文本文件读取和动态数组中的 EMTY 空间传递问题
- 将动态空间分配给字符串数组时出现问题
- 追加到具有可用空间的字符数组
- 如何在不分配更多存储空间的情况下从数组初始化向量