我需要将数组从{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;
}
答案 0 :(得分:5)
问题是仅将新数组分配给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
。
答案 1 :(得分:0)
问题是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
负责分配,重新分配和复制元素,以及释放它所使用的资源。
答案 2 :(得分:0)
既然你说C++
,我建议你使用一个合适的容器,例如std::vector
。
如果您没有充分理由进行自己的内存管理,则应避免使用new
和delete
,请参阅here以获得详细说明。
使用模板增强了将repeat
函数重用于double
以外的其他类型的可能性。
因此,您的代码将缩减为以下内容并且更易于阅读。
#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;
}