在C 中动态更改数组大小
Dynamically changing array size in C++
我需要将数组从 {4, 2 ,5}
转换为 {4, 2, 5, 4, 2, 5}
。这是我的输出:{4, 2, 5, 3.21143e-322, 0, 2}
,显然是不正确的。但是我似乎无法在逻辑中弄清楚这个问题。也许另一个观点可以找到这个问题。
这是我的代码:
void repeatArray(double* oldArray, int size) {
int newSize = size * 2;
double* newArray = new double[newSize];
for (int i = 0; i < size; i++) {
newArray[i] = oldArray[i];
}
for (int i = 0; i < size; i++) {
newArray[size+i] = oldArray[i];
}
oldArray = newArray;
delete [] newArray;
}
int main() {
double* oldArray = new double[3];
oldArray[0] = 4;
oldArray[1] = 2;
oldArray[2] = 5;
repeatArray(oldArray, 3);
for (int i=0; i<6; i++)
cout << oldArray[i] << endl;
delete []oldArray;
return 0;
}
问题是,仅将新数组分配给repeatArray()
中的指针不会从外部更改。
您在repeatArray()
中可以做的是返回新创建的数组。
double* repeatArray(double* oldArray, int size) {
int newSize = size * 2;
double* newArray = new double[newSize];
for (int i = 0; i < size; i++) {
newArray[i] = oldArray[i];
}
for (int i = 0; i < size; i++) {
newArray[size+i] = oldArray[i];
}
delete [] oldArray;
return newArray;
}
和main()
:
oldArray = repeatArray(oldArray, 3);
一种可能更好的方法是使用根据需要自动调整大小的std::vector
。
问题是repeatArray
参数是该函数本地的,因此,如果更改其值,则将更改超过函数调用。您可以使用指针double** oldArray
的指针来更改oldArray
指向的内容,或返回新数组位置的指针。
但是,这是C++
,您可以在其中使用STL容器。您的代码将变得更加简单和可读。
void repeat( std::vector<double>& numbers ) {
// Reserve rellocates the vector if there is not enough space
// otherwise, the iterators first and last could be invalidated.
numbers.reserve( numbers.size() * 2 );
auto first = numbers.begin();
auto last = numbers.end();
std::copy( first, last, std::back_inserter(numbers) );
}
int main() {
std::vector<double> nums({4, 2, 5});
repeat(nums);
for( double num : nums ) {
std::cout << num << 'n';
}
return 0;
}
std::vector
负责您的分配,重新分配和元素的副本,以及其使用的资源的交易。
由于您说C++
,我建议您使用适当的容器,例如std::vector
。
如果您没有充分的理由进行自己的内存管理,那么您应该避免使用new
和delete
,请参阅此处以获取详细说明。
使用模板增强了与double
以外的其他类型重复使用repeat
功能的可能性。
因此,您的代码被简化为以下内容,并且更易于阅读。
#include <vector>
#include <iostream>
template <typename T>
std::vector<T> repeat(const std::vector<T>& originalVec) {
auto repeatedVec = originalVec;
repeatedVec.insert(repeatedVec.end(), originalVec.begin(), originalVec.end());
return repeatedVec;
}
int main() {
std::vector<double> oldArray {4,2,5};
const auto newArray = repeat(oldArray);
for (const auto item : newArray) {
std::cout << item << std::endl;
}
return 0;
}
相关文章:
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结