【问题标题】:Why is not swap done? [closed]为什么不进行交换? [关闭]
【发布时间】:2019-07-22 15:40:41
【问题描述】:

没有交换

void f(struct a s)
{
    int t;
    for (int i = 0; i < 10; i++)
        for (int j = 0; j < 10; j++) {
            if (s.b[j] > s.b[j + 1]) {
                s.c = s.b[j];
                s.b[j] = s.b[j + 1];
                s.b[j + 1] = s.c;
            }
        }
}

输出是预期排列的,但和输入完全一样

【问题讨论】:

  • 很难说到底是什么问题,因为这个例子似乎不完整。但这很可能是因为您将一些a 传递给f,然后检查它是否有更改,但fs 是按值获取的。
  • 这里没有输出,也没有任何输入。但作为一种猜测,该函数按值获取其参数,因此任何更改都不会传播回调用者。
  • 如果你想交换两个值,你应该使用的是std::swap

标签: c++ struct reference pass-by-reference swap


【解决方案1】:

对于初学者来说,如果数组 s.b 恰好具有 10 元素,则该函数似乎具有未定义的行为,因为至少在此语句中

if (s.b[j] > s.b[j + 1]) {
                 ^^^^^^

j = 9(数组中没有索引为10的元素)时,试图访问数组之外​​的内存

至少按以下方式声明内部循环

    for (int j = 1; j < 10; j++) {
        if (s.b[j - 1] > s.b[j]) {
            s.c = s.b[j];
            s.b[j] = s.b[j - 1];
            s.b[j - 1] = s.c;
        }

也不清楚为什么实际上用作临时对象的数据成员s.c 在结构中声明。它应该从结构定义中删除,并且在循环中应该使用一些局部变量。例如

        if (s.b[j - 1] > s.b[j]) {
            auto tmp = s.b[j];
            s.b[j] = s.b[j - 1];
            s.b[j - 1] = tmp;
        }

你通过值传递了对象。因此该函数处理原始对象的副本。

注意有标准的 c++ 函数std::swap 可以做同样的事情。 例如

std::swap( s.b[j], s.b[j - 1] );

顺便说一句,函数中没有使用变量t

将参数声明为具有引用类型。

void f(struct a &s);

或者通过指向结构的指针

void f(struct a *s);

在这种情况下,要访问结构的数据成员,您应该编写示例

s->b[j - 1]

此外,使用10 之类的幻数也是一个坏主意。您可以在结构中声明一个静态数据成员,例如

static const int N = 10;

并在循环中使用变量N

例如

void f(struct a &s)
{
    for (int i = 0; i < a::N; i++)
        for (int j = 1; j < a::N; j++) {
            if (s.b[j - 1] > s.b[j]) {
                auto tmp = s.b[j];
                s.b[j] = s.b[j - 1];
                s.b[j - 1] = tmp;
            }
        }
}

【讨论】:

  • 谢谢我的朋友。 struct a{int b[10] and int c;} 这是冒泡排序。什么问题
  • @Matin.sadeghi 声明结构至少像 struct a { static const int N = 10;诠释 b[N]; };前提是您将程序编译为确实是 C++ 程序。
【解决方案2】:
void f(struct a s)

s 是按值传递的,它复制其内容。您需要通过引用或地址传递它来修改调用者的原始结构。

void f(struct a& s)

void f(struct a* s)
...
f(&s);

【讨论】:

  • return修改后的对象。
猜你喜欢
  • 1970-01-01
  • 2013-05-08
  • 2012-03-19
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
相关资源
最近更新 更多