【问题标题】:Can't reverse an array with double pointer不能用双指针反转数组
【发布时间】:2013-10-12 23:23:35
【问题描述】:

我在学校作业中遇到了一些问题,我们假设我们要创建自己的迭代器并使用它来反转数组中的元素。 如果它只是单指针,我想我会管理它,但这是双指针并且令人困惑......

下面是逆向代码:

void reverse(T start, T end)
{
    T temp = start;
    while(start < end)
    {
        *temp = *start;
        *start = *end;
        *end = *temp;
        ++start;
        --end;
    }
}

这就是问题所在,因为当我将temp 指向start 时,temp 会得到start 的值和地址。但是当我将start 指向end 时,那么start AND temp 自然变化。

我这辈子都不知道如何解决这个问题......

这是我在 main 中的调用:

int a[5] = {5, 12, 1, 6, 9};
Itterfunctions<int*> itt;
int *b = a;
itt.reverse(b, b+4);
for (int i = 0; i < 5; i++)
{
    cout<<a[i]<<" ";
}

【问题讨论】:

  • 您想复制临时字符。 char temp = *start;
  • 另外,int * 可能在 Itterfunctions&lt;int*&gt; itt; 中不需要
  • 临时点总是开始,这意味着每次你分配一些东西给临时你都会改变开始。我会将 temp 设为 int 而不是指针。
  • 我从不给 temp 分配任何东西,除了开始。它必须是一个指针,因为它应该是通用的,所以我可以用我的逆向器处理各种事情。
  • last 应该是比end 更好的名字,end 通常指的是一个迭代器,它指向最后一个元素之后的“无效”数据。

标签: c++ arrays pointers double reverse


【解决方案1】:

而不是

*temp = *start;
*start = *end;
*end = temp;

使用

std::swap(*start, *end);

当前您的临时变量指向start,因此您使用start 作为临时位置,但事实并非如此。

还要注意,通常end 不用于指向最后一个元素的迭代器。

【讨论】:

  • 自己写很容易。 template&lt;typename T&gt; void myswap(T&amp; lhs, T&amp; rhs) {T tmp(lhs); lhs = rhs; rhs = tmp; }(你可能有更好的带有移动语义的版本)。
【解决方案2】:

我解决了!

为这个问题坐了两天,当我最终决定在这里发布它时,我解决了它。

是这样的:

void reverse(T start, T end)
{
    unsigned temp = *start;
    while(start < end)
    {
        temp = *start;
        *start = *end;
        *end = temp;
        ++start;
        --end;
    }
}

我将 temp 设为 unsigned 而不是 T。但我不确定这是否适用于我们自己的对象,例如我们创建的球体等等...有人知道吗?

【讨论】:

  • 仅当*startunsigned int 时,使用unsigned int 才有效。如果你使用 c++11,你可以使用 auto temp = *start; 代替。而且std::swap更好。
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多