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

时间:2018-05-03 10:01:34

标签: c++ arrays sorting

我有以下代码

#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];
    }
}

我的第一个问题是如何按值传递数组,以便原始数组不会改变,其次我的sort函数不会生成正确的排序,我想按递减顺序对数组进行排序。

4 个答案:

答案 0 :(得分:1)

惯用 C ++中,声明arrint的{​​{1}}个数组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]; } } 的{​​{1}},其范围为两个<algorithm>参数

std::sort

答案 1 :(得分:0)

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/6521788 https://stackoverflow.com/a/16137995/6521788

您可以将值复制到新数组

答案 2 :(得分:0)

基本答案:您无法在C ++中按值传递数组。

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

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

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

答案 3 :(得分:0)

你的问题表明,如何处理C ++中的指针可能会有一些混乱。如果我的假设不正确,那么请跳过(我将在本文末尾提供&#34;我的解决方案&#34; /更正)。

回答你的第一个问题:你不能在C ++中为每个值传递C风格的数组,也不能通过引用传递。你唯一的选择&#34;将循环通过指针,直到&#39; \ n&#39;到达&amp;将内容存储在函数中创建的新数组中。

这将是

的内容
'{
    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)

指针指向内存中指向的第一个元素&amp;没有继承大小意义

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

在sort函数中不起作用(如果您不确切地知道要搜索的数组的长度,则可能会导致问题)。一个简单的解决方案是通过值/引用将函数的大小传递给函数。 另一个解决方案是通过类似于

的东西遍历数组本身
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。了解更多信息&amp;有关bubblesort的工作原理,请参阅https://de.wikipedia.org/wiki/Bubblesort

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

应更正为for(int i=0; i< 5-1-i; i++),因为最后的元素已经到位。

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

应更正为if (arr[j]< arr[j+1]),因为您想要比较(例如)第一个元素&amp;以降序/升序获取它的下一个元素。这可以为你的数组中的每个数字对完成。

最后:

        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]并且最后在j处存储6以降序(希望我现在得到了,但你得到了要点)

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