我有一个任意类型的二维数组,尺寸为N x M
(即T array[N][M];
),例如,
我要将其列(例如
)翻转
或其行,例如,
如何使用STL轻松完成此操作?
答案 0 :(得分:4)
您只需使用std::reverse
即可完成此操作。
下面我定义了两个通用函数,即flip_columns
和flip_rows
,它们将任意类型的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));});
}
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));
}
答案 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());