Tideman CS50 C ++排序功能

时间:2020-08-19 17:44:12

标签: c++ cs50

我已经通过了考试,但没有通过。这是正确的代码。

void sort_pairs(void)
{
    for (int i = 0; i < pair_count-1 ; i++)
    {
        for (int j=i+1; j<pair_count; j++)
        {
            if (preferences[pairs[i].winner][pairs[i].loser]<preferences[pairs[j].winner][pairs[j].loser])
            {
                pair temp = pairs[i];
                pairs[i]=pairs[j];
                pairs[j]=temp;
            }
        }
    }

    
    return;
}

这是我的旧代码。如您所见,我只是将交换部分移至sort_pairs代码中,即可突然工作。

void swap (pair a, pair b)
{
     pair temp = pairs[a];
     pairs[a]=pairs[b]
     pairs[b]=temp;
}

void sort_pairs(void)
{
    for (int i = 0; i < pair_count-1 ; i++)
    {
        for (int j=i+1; j<pair_count; j++)
        {
            if (preferences[pairs[i].winner][pairs[i].loser]<preferences[pairs[j].winner][pairs[j].loser])
            {
                swap (pairs[i],pairs[j]);
            }
        }
    }

    
    return;
}

现在我知道问题是按值传递的,因此从技术上讲,我只是交换a和b的副本,而不是原始值i和j。但是,最让我困惑的是何时需要使用指针。

#include <stdio.h>

int sum (int a, int b);

int main (void)
{
    int x = 1;
    int y = 2;
    x = sum (x,y);
    printf("%i",x);
}

int sum (int a, int b)
{
    return (a+b);
}

这将完美返回3。但是,函数sum不是在更改x的副本,而不是在更改“真实” x的吗?因为如果对交换执行相同操作,它将无法正常工作(如下所示)。

#include <stdio.h>

void swap (int a, int b);

int main (void)
{
    int x = 1;
    int y = 2;
    swap (x,y);
    printf("x=%i and y=%i",x,y);
}

void swap (int a, int b)
{
    int temp = a;
    a=b;
    b=temp;
    return;
}

x仍将保留原始x,y将保留原始y。

1 个答案:

答案 0 :(得分:1)

这将pair s作为值:

void swap (pair a, pair b)     // a is a copy of pairs[i] and b is a copy of pairs[j]

当函数退出时,您对函数ab所做的更改将被放弃。 ab仅在函数本地。

取而代之的是通过引用(pair&),然后swap正确的变量:

void swap (pair& a, pair& b) { // a is a ref to pairs[i] and b is a ref to pairs[j]
     pair temp = a;            // temp is copy constructed from pairs[i]
     a = b;                    // pairs[i] is copy assigned from pairs[j]
     b = temp;                 // pairs[j] is copy assigned from temp
}

旁注:标准库std::swap中有一个出色的swap实用程序

在您的sum函数中,有ab以及涉及到的未命名临时变量。这是返回值。如果我通过添加显示它,它可能会更清楚:

int sum (int a, int b) {
    int temp = a + b;
    return temp;
}

ab不做任何更改,您return的计算结果。在swap函数中,应该更改用作输入的变量,这就是为什么需要使用对这些变量的引用的原因。例如,您可以编写另一个附加功能,如下所示:

void add_x_to_y(int x, int& y) {
    y += x;
}

这里x是按值取值的,而y是引用的,因为我们应该在x上加上y。然后,在函数内部对y所做的更改将直接对作为y传递给函数的变量进行。

最让我困惑的是何时需要使用指针。

在任何情况下都不会使用指针。仅引用和值。