【问题标题】:How can i change the order of 2 objects in an array?如何更改数组中 2 个对象的顺序?
【发布时间】:2019-11-02 14:50:22
【问题描述】:

所以,我有一个大小为 3 的桶数组。声明为:

Bucket* bucket = new Bucket[size]();

我有一个函数可以打印出每个桶的地址:

printBucket(Bucket* tempBucket)
{
cout << "Address is:" << tempbucket << endl;
}

假设它输出(对于所有存储桶):

1st bucket address:015650DC
2nd bucket address:015650E8
3rd bucket address:015650F4

我想用第三个桶来改变第二个桶,所以我创建了这个函数:

Bucket* changeBucket(Bucket* buckets, int first, int second)
{

    Bucket* temp = new Bucket();
    temp = &buckets[first];
    buckets[first] = buckets[second];
    buckets[second] = *temp;
    return buckets;
}

调用这个函数后,地址输出还是一样的:

1st bucket address:015650DC
2nd bucket address:015650E8
3rd bucket address:015650F4

我想要的输出是:

1st bucket address:015650DC
2nd bucket address:015650F4
3rd bucket address:015650E8

【问题讨论】:

  • 你在changeBucket 的前两行中泄漏了内存。这不是 Java。你不必new 一切。您还会丢失数组的真正第一个值,并复制第二个。
  • std::swap 可能是您要找的吗?
  • "我有一个大小为 3 的桶数组。声明为有一个大小为 3 的桶数组。声明为..." - 为什么?为什么不是std::vector&lt;Bucker&gt; buckets(size)
  • 另外,考虑到@WhozCraig 提出的观点,Bucket 复制构造函数/赋值运算符是什么样的?
  • 您想要的输出与数组的内容不一致。数组在内存中按顺序排列其内容。如果它有三个对象,则第二个的地址在第一个和第三个之间。总是。这就是数组的工作原理。所以你已经跳进了XY problem。您的真正目标是检查changeBucket 函数是否成功?如果是这样,您应该查看数组元素的内容,而不是地址。

标签: c++ arrays pointers


【解决方案1】:

你试过简单吗:

Bucket* changeBucket(Bucket* buckets, int first, int second)
{

Bucket temp;
temp = buckets[first];
buckets[first] = buckets[second];
buckets[second] = temp;
return buckets;
}

而且你也可以把原型改成“void”,你对数组所做的改变是永久的(数组到底是指针)

【讨论】:

  • 结合前两行可以更简单:Bucket temp = buckets[first];
【解决方案2】:

这里的问题是您正在交换两个数组元素的内容,但您没有(也不能)更改数组元素的地址。

当您使用Bucket* bucket = new Bucket[size](); 创建数组时,您正在创建一个足够大的内存块来容纳size 类型为Bucket 的对象。这将是一个连续内存块,其中任何元素都可以使用[] 运算符访问,这样bucket[2] 将引用第三个(索引从零开始)元素。

因此,当您调用 changeBucket 函数时,您正在更改数组中两个元素的内容。您没有更改这些元素的地址,它们始终相对于第一个元素是固定的(它本身由new[] 操作确定)。

如果您可以更改地址,那么它将使数组的整个概念无效,因为您似乎想要的是像 bucket[2] 这样的表达式应该引用第二个元素,而不是第三 - 这显然是 c++ 编程的基本原则所不能接受的。

或者,您可能正在寻找的是一个指向存储桶的指针数组 - 其中数组的每个元素都指向一个对象;在这种情况下,您可以(合法地)交换这些指针。如果这是您想要做的,我可以提供一些代码更改。

请随时要求进一步澄清和/或解释。

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 2021-12-23
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多