如何使用STL翻转/反转2D阵列的行或列

时间:2015-10-18 22:18:16

标签: c++ arrays c++11 multidimensional-array stl

我有一个任意类型的二维数组,尺寸为N x M(即T array[N][M];),例如,

我要将其(例如

)翻转

或其,例如,

如何使用STL轻松完成此操作?

3 个答案:

答案 0 :(得分:4)

您只需使用std::reverse即可完成此操作。

下面我定义了两个通用函数,即flip_columnsflip_rows,它们将任意类型的2D数组作为输入,并分别翻转/反转其列和行。

翻转/反转2D阵列列

template<typename T, std::size_t N, std::size_t M>
void flip_columns(T (&arr)[N][M]) {
  std::for_each(std::begin(arr), std::end(arr),
                [](auto &i) {std::reverse(std::begin(i), std::end(i));});
}

翻转/反转2D阵列行

template<typename T, std::size_t N, std::size_t M>
void flip_rows(T (&arr)[N][M]) {
  std::reverse(std::begin(arr), std::end(arr));
}

LIVE DEMO

答案 1 :(得分:2)

无需在内存中移动内容。一种典型的方法是定义一个遍历政策,即“旅行”。指定顺序的数组(反向列或反向行),这对于我们不想搞砸的非常大的对象特别有效。

展示这个,下面的帮助者&#34;反转&#34;行和列同时:

template<typename T, std::size_t N, std::size_t K>
struct Rev
{
    T(&data)[N][K];
    Rev(T(&data)[N][K]) : val(val) { }
    T& access(std::size_t row, std::size_t column) {
        return val[N - row - 1][K - column - 1];
    }
};

示例:

int ar[2][5] = { { 1, 2, 3, 4, 5 }, { 11, 22, 33, 44, 55 } };

Rev<int, 2, 5> ob(ar);
std::cout << ob.access(1, 3); // prints 2

我选择了access方法,因为自定义operator[]需要返回一个可索引的临时对象,并且需要更多的行与此处显示的引用包装一样高效;无论如何它的可行方式与内置数组的接口相匹配,即:

Rev<int, 2, 5> ob(ar)
ob[1][3]; 

本着同样的精神,反向迭代器可用于遍历数组的切片(行或列)

答案 2 :(得分:-1)

在二维向量中

旋转我们使用的行 -> reverse(a[i].begin,a[i].end());

我们使用的旋转列 -> reverse(a.begin(),a.end());