我有这个功能:
void reverse(int* nums, unsigned int size)
此函数应该反转它所获得的数组中的值。
现在为了反转,我想创建另一个传入数组大小的数组。将这个新数组从原始数组的末尾分配到开头。
但我是C ++中的新手,所以我不知道如何以函数参数的大小创建dynamic array
。
答案 0 :(得分:2)
实际上没有必要在这里分配新的数组。看看您是否可以通过就地重新安排现有元素来找到解决此问题的方法。
鉴于这似乎是一个带指针的练习,你可以使用.header
运算符来分配空间:
new[]
然后你可以通过写
来释放它int* auxiliaryArray = new int[size];
但是,这不是在C ++中执行此操作的首选方法。更好的途径是使用delete[] auxiliaryArray;
,它会完成所有自己的内存管理。这看起来像这样:
std::vector
然后,您可以使用方括号访问元素,就像在真实数组中一样。为此,您需要在程序的顶部std::vector<int> auxSpace(size);
。
答案 1 :(得分:0)
在C ++中,创建可变大小数组的推荐方法是使用std :: vector
#include <vector>
void reverse(int* nums, unsigned int size)
{
std::vector<int> V(size);
...
}
但是这种方法在性能方面并不是最好的,因为它需要额外的内存来分配数组的大小,这可能很大。最好从数组的外部开始并逐个交换成员处于镜像位置(因此如果大小为5,则交换0和4,然后交换1和3并单独留下2)。这只需要临时存储一个int。
答案 2 :(得分:0)
您可以在不需要创建其他数组的情况下执行此操作:
void reverse(int* array, const int size){
for(int i = 0; i < size / 2; i++){
int tmp = array[i];
array[i] = array[size - 1 - i];
array[size - 1 - i] = tmp;
}
}
int main(){
int array[] = {1, 3, 5, 7, 9, 11};
const int size = sizeof(array) / sizeof(array[0]);
reverse(array, size);
for(int i(0); i < size; i++)
std::cout << array[i] << ", ";
}
正如你在循环中看到的那样,你只需要将第一个元素(元素0)与n-1元素交换,第二个元素与n-1-1和儿子交换......
请记住,数组的编制方式为0
到n-1
。
如果要分配不实用的新数组:
int* reverse2(int* array, const int size){
int* tmp = new int[size];
for(int i(size - 1), j(0); j < size; j++, i--)
tmp[j] = array[i];
return tmp;
}
int main(){
int array[] = {1, 3, 5, 7, 9, 11};
for(int i(0); i < size; i++)
std::cout << array[i] << ", ";
std::cout << std::endl;
int* newArray = reverse2(array, size);
for(int i(0) ; i < size; i++)
std::cout << newArray[i] << ", ";
std::cout << std::endl;
delete[] newArray;
return 0;
}
答案 3 :(得分:0)
如果你想使用一个新阵列,我认为是用大炮杀死苍蝇。
看起来您使用的是纯C代码而不是C ++。我说是因为功能的签名。通用C ++代码中函数的签名可能与此类似:
void reverse(std::vector& items);
您可以使用当前阵列反转当前阵列而不使用新阵列。您正在将指针传递给数组的第一项,并且内容不是常量,因此您可以对其进行修改。该功能的更好的签名可以是:
void reverse(int* const nums, const unsigned int size);
看起来像指针问题。考虑迭代阵列位置的边界。你需要迭代整个数组吗?也许只有一半阵列? ;)
作为奖励跟踪,如何在没有辅助变量的情况下交换值? (在这种情况下,我们使用的是基本类型int
......请记住二进制算法)。
array[pos_head] ^= array[pos_tail];
array[pos_tail] ^= array[pos_head];
array[pos_head] ^= array[pos_tail];