如何在C ++中反转动态数组?

时间:2018-03-20 00:27:29

标签: c++ arrays

这是我第一次尝试倒转动态数组:

bool reverse()
{
    T *newArray = NULL;

    // Validate operation.
    if (!isValid() || isReadOnly())
        return false;

    // Allocate new array
    newArray = new (std::nothrow)T[m_size];
    if (newArray == NULL)
        return false;

    // Reverse the array's contents.
    for (int i = m_size - 1; i >= 0; i--)
        newArray[i] = m_array[i];

    // Delete old array.
    delete[] m_array; 
    m_array = NULL;

    // Assign new array 
    m_array = newArray; 

    return true;
}

可以想象,对于大型阵列来说这是非常昂贵的:

  • 分配和处理需要时间。
  • 带'for'的线性算法也需要时间。

我知道std :: reverse,但遗憾的是它不适用于动态数组。

我应该使用std :: vector吗?是。但这是为了学习。我正在阅读数据结构游戏编程书并扩展我的学习。

所以我有兴趣将Array的成员函数减少到算法本身:

    // Reverse the array's contents.
    for (int i = m_size - 1; i >= 0; i--)
        newArray[i] = m_array[i];

我觉得有一种简单的方法可以解决这个问题。我查看了Google,但我只是在寻找静态数组的解决方案。

先谢谢。

额外:

我再次尝试std :: reverse,但到目前为止没有运气。

std::reverse(std::begin(m_array), std::end(m_array));

编译错误:

  

错误C2672:'begin':找不到匹配的重载函数

另外,std :: end不会知道动态数组的结束,因为没有指定大小,所以也许我只是使用错误的函数来实现这个目标。以某种方式使用std :: reverse会很好。

3 个答案:

答案 0 :(得分:4)

std::reverse(m_array+0, m_array+m_size);

std::reverse将迭代器作为参数,指针是迭代器的一种形式。

答案 1 :(得分:0)

它工作正常,因为你可以使用指针与每个可以使用迭代器的std函数:

int size = 10;
int *i = new int[size];
iota(i, i + size, 0);
copy(i, i + size, ostream_iterator<int>(cout, " "));
reverse(i, i + size);
copy(i, i + size, ostream_iterator<int>(cout, " "));
0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0

您可以查看此文章Raw pointers are also Iterators!

答案 2 :(得分:0)

您可以手动将起始索引与结束索引交换,以有效地反转数组。

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    int* array = new int[6]{ 1, 2, 3, 4, 5, 6 };
    constexpr std::size_t size = 6;

    //swap ending and starting iterators
    for (std::size_t index = 0, end = size / 2; index != end; ++index) {
        std::swap(array[index], array[size - index - 1]);
    }

    for (std::size_t index = 0; index != size; ++index) {
        std::cout << array[index] << ' ';
    }
    std::cout << std::endl << std::endl;

    std::reverse(array, array + size);

    for (std::size_t index = 0; index != size; ++index) {
        std::cout << array[index] << ' ';
    }

    delete[] array;
    return 0;
}

std::reverse也可以工作,因为它接受一个起始和结束迭代器,指针可以作为迭代器。