如何在c++中按值传递数组

how to pass array by value in c++

本文关键字:按值传递 数组 c++      更新时间:2023-10-16

我有以下代码

#include <iostream>
using namespace std;
int *sort(int arr[]){
for(int i =0; i< 1; i++){
for(int j= 1; j< 5; j++){
if(arr[i]< arr[j]){
int temp = arr[i];
arr[i] =arr[j];
arr[j] = temp;
}
}
}
for(int k=0; k<5;k++){
cout<<arr[k];
}
return arr;
}
int main(){  
int arr[5] = {1,2,3,4,5};
sort(arr);
for(int m=0; m<5; m++){
cout<<arr[m];
}
}

我的第一个问题是如何按值传递数组,这样原始数组就不会改变,其次,我的排序函数没有生成正确的排序,我想按降序对数组进行排序。

惯用C++中,一个由5个ints组成的数组arr被声明为std::array<int, 5> arr;std::vector<int> arr(5);。值的交换是std::swap。函数应该更改其参数并返回void,或者更改副本并返回该值。

你也不会循环通过你的外循环中的每一个元素。

#include <array>
#include <iostream>
void sort(std::array<int, 5> & arr){
for(int i = 0; i < 5; i++){
for(int j = 1; j < 5; j++){
if(arr[i] < arr[j]){
std::swap(arr[i], arr[j]);
}
}
}
}
int main(){  
std::array<int, 5> arr = {1,2,3,4,5};
sort(arr);
for(int m=0; m<5; m++){
std::cout<<arr[m];
}
}

然而,最简单的排序方法是使用<algorithm>std::sort,它将一个范围作为两个Iterator参数

#include <algorithm>
#include <array>
#include <iostream>
int main(){  
std::array<int, 5> arr = {1,2,3,4,5};
std::sort(arr.begin(), arr.end(), std::greater<int>{});
for(int m=0; m<5; m++){
std::cout<<arr[m];
}
}

1)您可以使用c++swap函数,而不是使用临时变量

swap(arr[i], arr[j]);

2) 你的for循环应该像这个

for(int i = 0; i < 5; i++) {
for(int j = i; j < 5; j++) {

外部循环必须遍历整个数组(从0到4),内部循环必须遍历数组的"右侧",因为左侧已经排序为

所以我们不能按值传递数组

https://stackoverflow.com/a/16137997/6521788https://stackoverflow.com/a/16137995/6521788

您可以将值复制到一个新的数组中

基本答案:在C++中不能按值传递数组。

解决方案1:在将C样式数组传递给函数之前,先复制它,并删除您的return语句,因为不需要它。

解决方案2:使用std::array,这是一个提供与基本数组相同功能的容器,也是一个复制构造函数和复制赋值运算符。

其他备注:STL确实提供了排序算法(std::sort),所以在未来程序员的生活中,不要自己实现排序算法,除非你在性能重要的地方做了一些非常具体的事情。

您的问题表明,对于如何处理C++中的指针,可能存在相当多的困惑。如果我的假设不正确,那么就跳过(我将在本文末尾提供"我的解决方案"/更正)。

为了回答您的第一个问题:您不能在C++中按每个值传递C样式数组,也不能通过引用传递。您唯一的"选项"是在指针中循环,直到达到"\n"为止&将内容存储在函数中创建的新数组中。

这将是类似的东西

'{
int arrx[5] = {};
for(int i = 0; i < 5; i++) 
{
arrx[i] = arr[i];
}
for (int j = 0; j < 5; j++) // print
{
std::cout << arrx[j];
}
return 0;
}`

关于指针的其他几点:

int *sort(int arr[]){ -> arr[] passes a pointer to arr(same as *arr)

指向内存中指向&没有表示的继承大小

sizeof(arr) / sizeof(arr[0])

在排序函数中不起作用(如果您不知道要搜索的数组的确切长度,这可能会导致问题)。一个简单的解决方案是通过对函数的值/引用来传递数组的大小。另一种解决方案是通过类似的东西在阵列中循环

for(;arr != 'n'; arr++)
{
//your code here

通过访问各种教程网站,你可以获得比我能给你的更多的关于指针的信息。例如:https://www.tutorialspoint.com/cplusplus/cpp_pointers.htm

http://www.cplusplus.com/doc/tutorial/pointers/

但现在回到您最初的问题,希望能得到答案。

int *sort(int arr[]) {
for (int i = 0; i< 1; i++) { 

应更正为for(int i=0; i< 5-1; i++)

您试图实现的排序函数称为bubblesort。以获取更多信息&bubblesort的工作原理请参阅https://de.wikipedia.org/wiki/Bubblesort

for (int j = 1; j< 5; j++) {

应校正为CCD_ 15,因为最后的元素已经就位。

if (arr[i]< arr[j]) {

应该更正为CCD_ 16,因为您想比较(例如)第一个元素&按降序/升序获取的下一个元素。对数组中的每个数字对都执行此操作。

最后:

int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;

应该看起来像是:

int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;

请注意,您也可以将其重新格式化为:

int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp; // same output

举个例子:如果arr[j]=5,arr[j+1]=6,那么你将值j+1(6)存储在temp中,用j(5)覆盖arr[j+1],最后将6存储在j中以获得降序(希望我现在就得到了,但你得到了要点)

最后;正如其他人已经正确指出的那样,您可以使用std::swap而不是使用key/temp变量。