c++ - 反转数组时遇到问题

标签 c++ arrays algorithm reverse

这是我的代码:

#include <iostream>

using namespace std;

void reverse(int *, int);

int main()
{
    const int len = 10;
    int intArray[len] = {5, 6, 4, 1, 3, 10, 15, 13, 2, 7};
    reverse(intArray, len);
}

void reverse(int intArray[], int len)
{
    int j = len;
    for(int i = 0; i < len; i++)
    {
        --j;
        intArray[i] = intArray[j];
        cout << intArray[i] << " ";

    }
}

然后这是我的输出:

7 2 13 15 10 10 15 13 2 7

我看到一些代码示例执行相同的操作,我想知道为什么它们都使用临时变量以及是否有必要?

另外,这个问题是 MIT OCW 作业的变体。尽管他们的赋值不需要打印出反转数组,但他们希望我们将反转后的值存储在原始数组中。但是出于某种原因,他们的 for 循环只运行了一半的长度?这是他们的解决方案:

void reverse (int numbers [] , const int numbersLen ) 
{

for(int i = 0; i < numbersLen / 2; ++ i ) {

int tmp = numbers [ i ];

int indexFromEnd = numbersLen - i - 1;

numbers [ i ] = numbers [ indexFromEnd ];

numbers [ indexFromEnd ] = tmp ;

}

}

最佳答案

只需将标准算法 std::reversestd::beginstd::end 迭代器一起使用

#include <algorithm>
#include <iostream>

int main()
{
    const int len = 10;
    int intArray[len] = {5, 6, 4, 1, 3, 10, 15, 13, 2, 7};
    std::reverse(std::begin(intArray), std::end(intArray));

    for (auto&& e : intArray)
        std::cout << e << ", ";
}

Live Example .

如果你必须编写自己的反向算法,这里有一个可能的实现

template<class BidirIt>
void reverse(BidirIt first, BidirIt last)
{
    while ((first != last) && (first != --last)) {
        std::iter_swap(first++, last);
    }
}

这里,std::iter_swap(a, b) 只是调用了 std::swap(*a, *b)。当然,您可以提出自己的交换方案。

建议让算法采用迭代器对,以便与标准库的其余部分兼容。

关于c++ - 反转数组时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25862672/

相关文章:

c++ - 错误 C2512 : 'std::basic_ostream<_Elem,_Traits>' : no appropriate default constructor available with Visual Studio only

c++ - 如何在 C 中模仿 C++ "pass array(pointer) by reference"?

C 数组结构声明

c - 为什么会出现段错误(核心已转储)?

python - 如何在 python 中打印对象的二维数组?

algorithm - 如何使空间复杂度为 O(1)

c++ - 禁用 MSVC 的异常

c++ - 从 QThread 类监控 Qt GUI

algorithm - 蚁群优化问题 : how to output results correctly, 算法的结果是什么等

r - 遍历数据框中所有可能的列和行组合