简单的2维数组操作

原创 2004年09月21日 10:28:00

简单的2维数组操作(90度,180/270度旋转,镜像,flip),希望有人提供更好/更快的方法。Use it at your own risk!

//By Onega

#include <iostream>
#include <sstream>
using namespace std;
template<typename DT>
void array_rotateL90(const DT* psrc,int h,int w,DT* dest)
{
 //psrc[h][w] , dest[w][h]
 if(0==psrc || h<= 0 || w<=0 || 0==dest)
  return;
 int index = 0;
 int constant1 = (w-1)*h;
 for(int i = 0; i < h; i++)
 {
     int var = 0;
     for(int j = 0; j< w; j++)
     {
         //dest[ (w-1-j)*h +i] = psrc[index];
         //dest[ (w-1)*h - j*h +i] = psrc[index];
         dest[ constant1 - var +i] = psrc[index];
         var += h;
         index++;
     }   
 }
}

template<typename DT>
void array_rotateR90(const DT* psrc,int h,int w,DT* dest)
{
 //psrc[h][w] , dest[w][h]
 if(0==psrc || h<= 0 || w<=0 || 0==dest)
  return;
 int var = 0;
 int constant1 = h - 1;
 for(int j=0;j<w;j++)
 {
     //var = j*h
     int var2 = 0; // i*w;
  for(int i=0;i<h ;i++)
  {
   //dest[var+constant1-i] = psrc[ i*w+j];
   dest[var+constant1-i] = psrc[ var2+j];
   var2 += w;
  }
  var += h;
 }
}
template<typename DT2>
void array_rotate180(const DT2* psrc,int n,int m,DT2* dest)
{
 //psrc[n][m]
 int constant1 = (m-1)*n + n-1;
 int var = 0;// i * n
 int index = 0;
 for(int i=0;i<m;i++)
 {
  for(int j=0;j<n;j++)
  {
//   dest[(m-1-i)*n+n-1-j] = psrc[i*n+j];
   dest[constant1 -j -var] = psrc[index];
   index++;
  }
  var += n; //i*n
 }  
}
template<typename DT>
void print_array(const DT* psrc,int w,int h, const char* desc=0)
{
    //this is for test/debug only, efficiency is not required.
 if(0==psrc || h<= 0 || w<=0 )
  return;
 std::ostringstream oss;
 if(desc==0)
   oss<<"array"<<std::endl;
 else
 oss<<desc<<std::endl;
 for(int i=0;i<w;i++)
 {
  for(int j=0;j<h;j++)
  {
   oss<< psrc[i*h+j] <<" ";
  }
  oss<< char(0xd)<<char(0xa);
 }
 std::cout<<oss.str();
}
template<typename DT>
void array_flip(const DT* psrc,int w,int h, DT* dest)
{
 if(0==psrc || h<= 0 || w<=0 || 0==dest)
  return;
    int offset = (w-1)*h;
    int row_start = 0;
    int offset2 = 0;
    for(int i=0;i<w;i++)
    {
        offset2 = offset - row_start;// (w-1)*h - i*h
        for(int j=0;j<h;j++)
        {
            //dest[ (w-1-i)*h+j] = psrc[i*h+j];
            dest[ offset2 +j] = psrc[row_start +j];
        }   
        row_start += h; // i*h
    }   
}
template<typename DT>
void array_mirror(const DT* psrc,int w,int h, DT* dest)
{
 if(0==psrc || h<= 0 || w<=0 || 0==dest)
  return;
    int h_1 = h - 1;
    int index = 0;
    for(int i=0;i<w;i++)
    {
        for(int j=0;j<h;j++)
        {
            dest[index+h_1-j-j] = psrc[index];
            index ++;
        }   
    }   
}   

int main (int argc, char *argv[])
{
    cout<< " the program is used to test rotate, flip, mirror methods"<<std::endl;
    cout<< " I want to deal with large 2D array with above methods"<<std::endl;
    cout<< " source array may range from [128][128] to [2096][2096]"<<std::endl;
    cout<< " DT is expected to be byte, short, int, int64"<<std::endl;
  int test[3][2];
 {
 for(int i=0;i<3;i++)
  for(int j=0;j<2;j++)
   test[i][j] = i*10+j+10;
 }
 print_array((int*)test[0],3,2,"original array ");
 int dest[2][3];
 for(int i=0;i<2;i++)
  for(int j=0;j<3;j++)
   dest[i][j] = 0;
 array_rotateL90<int>(test[0],3,2,dest[0]);
 print_array((int*)dest[0],2,3,"after array_rotateL90");

 int dest180[3][2];
 //array_rotate180(test[0],3,2,dest180[0]);
 array_rotate180(test[0],3,2,dest180[0]);
 print_array((int*)dest180[0],3,2,"after array_rotate180");
 cout<<"press any key to exit"<<std::endl;
 char c;
 cin>>c;
    return 0;
}

二维数组作为函数参数传递剖析(C语言)总结

前言   很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {....
  • benpaobagzb
  • benpaobagzb
  • 2016年03月03日 17:43
  • 217

双重指针与2维数组

void Func1(int *p) { } void Func2(int a[]) { } int main() {   int a[10];   Func1(a);  ...
  • u011068464
  • u011068464
  • 2014年06月10日 22:22
  • 1713

两道“诡异”的数组越界问题的分析

1、数组越界引起的死循环问题:#include "stdafx.h"int main(int argc, char* argv[]) { int i = 0; int arr[3] = ...
  • Apollon_krj
  • Apollon_krj
  • 2017年08月05日 17:29
  • 228

C++ vector之创建二维数组

头文件:#include #include #include using namespace std;申明二维数组:vectorvec;//嵌套申明此时的vec.size为0,空有其名,没有空间...
  • baidu_31818237
  • baidu_31818237
  • 2016年07月31日 21:20
  • 2062

用最简单的数组去实现队列

用数组去实现队列在上一节中我们是用数组去实现了客栈的功能,那么我们在这节中学习如何用数组去实现队列的功能队列是一种先进先出的数据结构(fisrt-in-first-out) 队列之允许在后端进行插入操...
  • qq_29924041
  • qq_29924041
  • 2016年12月20日 23:15
  • 688

Python多维数组和矩阵

1,用numpy对数组进行运算 from numpy import array mm=array((1, 1, 1)) pp=array((1, 2, 3)) 则pp+mm 输出 array([2,3...
  • qxqxqzzz
  • qxqxqzzz
  • 2016年03月22日 13:03
  • 9965

二维数组的声明,定义及应用

二维数组的应用 package Java; import java.util.Scanner; public class Domo { //使用随机数或者键入 public static v...
  • wuxiushu
  • wuxiushu
  • 2016年06月08日 14:27
  • 2181

JavaSE_数组_2维数组+数组转集合

二维数组定义 import org.junit.Test; public class Array_2 { @Test public void method4() { //二维数组的遍历 ...
  • u012576807
  • u012576807
  • 2013年12月31日 11:12
  • 723

Net二维数组的使用

简要说明了二维数组的内存结构、定义及调用方法。
  • ennaymonkey
  • ennaymonkey
  • 2017年02月28日 09:44
  • 662

01背包的理解,二维数组化一维数组的理解(附hdu2602 Bone Collector)

01背包问题:有n个物品和一个容量为v的背包,用val[i]表示第i个物品的价值,用vol[i]表示第i个物品的体积,那么,如何使背包里装的物品的总价值最大呢?贪心是不行的,举个反例:n=3, v=1...
  • qq_33279781
  • qq_33279781
  • 2016年07月30日 16:41
  • 811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的2维数组操作
举报原因:
原因补充:

(最多只允许输入30个字)