精华内容
下载资源
问答
  • 一维数组下标为index,二维数组长度为m * n,则: 一维数组转换为二维数组 row = index / n col = index % n 二维数组转换为一维数组 index = col + row * n

    设一维数组下标为index,二维数组长度为m * n,则:

    一维数组转换为二维数组

    row = index / n 
    col = index % n
    

    二维数组转换为一维数组

    index = col + row * n
    
    展开全文
  • 【C++】重载二维数组下标 [ ][ ]

    千次阅读 2014-03-16 19:34:25
    重载一维数组下标很简单,通过下标传入的索引值,返回内部数组中相应的值。那重载二维数组的下标运算呢? 其实重载二维和一维本质是一样的,因为 C/C++ 中所谓的 “二维或多维数组”都是又简单的一维数组表示的。举...
    写在文章开头的话
    读完这篇文章后,你将学习到下面的知识:
    (1)一个多维数组是如何工作的
    (2)如何重载二维数组下标

    1. 分析


    重载一维数组下标很简单,通过下标传入的索引值,返回内部数组中相应的值。那重载二维数组的下标运算呢?
    其实重载二维和一维本质是一样的,因为 C/C++ 中所谓的 “二维或多维数组”都是由简单的一维数组表示的。举个例子哈:
    下面是两个 int 数组,第(1)个是熟悉的一维数组,第(2)个是熟悉的二维数组,现在你要做的就是将第(2)个数组看成是一个一维数组。
    (1)int array[3];          
    (2)int array[3][4];
    怎么看?可以在头脑中将第(2)个数组数组看成如下定义的方式, 数组 array 包含 3 个元素,其中每个元素又都是一个数组类型(或者说是一个指针类型)。
    typedef int T[4];
    T array[3];

    至于更高维数的数组,也是这样看,比如如下的三维数组,可以采用下面的方式来定义。
    int array[3][4][5];
    typedef int T1[5];
    typedef T1 T2[4];
    T2 array[3];

    由于实际中二维数组用的较多,所以,下面主要是练习二维数组的下标重载。那重载二维数组的下标有什么好处呢?最大的好处就在于可以使代码简洁直观。

    我在网上也看到过一些别人的实现方法,其中在 文章(http://edu.gamfe.com/tutor/d/24416.html)中就提到了一种重载方法,使用一维数组来表示二维数组,这是大多数的实现方法,但是其实现过程过于复杂,其构建了两个类,分别用来获取行和列,然后计算出指定的二维下标对应的内部一维数组的值并返回。

    下面介绍我自己写重载二维下标实现方式,不一定最好,但比上面提到的方式要好。

    2. 重载固定维数的二维数组下标

    对于固定维数的二维数组下标重载,一般在像3D图形方面经常涉及到一些平移转换矩阵时用到,这里以 4 * 4 的矩阵为例,实现代码如下:

    struct Matrix4f
    {
        float m[4][4];
    
        float * const operator[](const int i)
        {
            return m[i];
        }
    };

    测试赋值和取值操作,均正常:

    Matrix4f m;
        m[0][0] = 1.0f;
        m[1][1] = 9.9f;
        cout << m[0][0] << endl;          // 1
        cout << m[1][1] << endl;          // 9.9

    3. 重载维数可变的二维数组下标

    对于可变的二维数组下标重载,在数组初始化时指定维数,之后可以像一般的二维数组进行赋值和取值操作,采用模板实现,代码如下:

    template <typename T>
    class Matrix
    {
    public:
        Matrix(int row, int col)
            :m_row(row), m_col(col), m_data(nullptr)
        {
            m_data = new T[m_row * m_col];
        }
    
        ~Matrix()
        {
            if (m_data != nullptr)
            {
                delete[] m_data;
                m_data = nullptr;
            }
        }
        
         // 返回二维数组的第 k 行地址
        T * operator[](int k)
        {
            return &m_data[k * m_col];
        }
    
    private:
        int m_row;
        int m_col;
        T *m_data;
    };
    

    测试赋值和取值操作:

    Matrix<int> m2(3, 4);
    m2[0][0] = 2;
    m2[2][3] = 9;
    cout << m2[0][0] << endl;          // 2
    cout << m2[2][3] << endl;          // 9

    和一般的二维数组一样没有越界检查,所以越界操作也是可以的,但是尽量使用前检查索引是否越界,以免引发未知错误。


    转载请注明出处:http://blog.csdn.net/xiaohui_hubei/article/details/21334141

    展开全文
  • 数组下标的形式记录一个一维数组中下标所对应的元素出现在个数,并对此一维数组进行排序。 例如:一个一维数组中的元素为:a[4] = { 2,3,2,5 };此数组为一个长度为4的数组,另一个空数组x[6]={ 0 };x[0] = 0...

    用另一个数组下标的形式记录一个一维数组中下标所对应的元素出现在个数,并对此一维数组进行排序。
    例如:一个一维数组中的元素为:a[4] = { 2,3,2,5 };此数组为一个长度为4的数组,另一个空数组x[6]={ 0 };x[0] = 0,因为使用下标的形式记录a数组中的元素,此时x[]的下标为0,但a数组中没有0这个元素,所以x[0] = 0;类似,x[1]=0;x[2] = 2,这是因为在a数组中2这个元素出现了2次,同样可知,a[3] = 1,a[4] = 0,a[5] = 1;a数组中的所有元素遍历完,最大的元素为5,所以我们为x申请的空间大小为6,x[6]将不会被取到;

    #include<iostream>
    using namespace std;
    void input(int *p,int n);     //input the array value
    void disp(int *p, int n);     //input the input array value.
    void search(int *p,int *x, int m, int n);    //according the array's index to sreach element 
    void output(int *p, int index, int i);   //input the new sort array.
    
    int main()
    {
    	int n;
    	int a[20], x[20];
    	n = 5;              //total number of array
    	input(a,n);
    	disp(a,n);
    	search(a,x, n, 10);
    }
    
    void input(int *arr,int n)
    {
    	int i;
    	cout << "input a array value:" << endl;
    	for (i = 0; i <n; i++)
    	{
    		cin >> *(arr + i);            //arr + i  表示的是地址  并不是值;
    	}
    }
    
    void disp(int *arr, int n)
    {
    	int i;
    	cout << "The array is:" << endl;
    	for (i = 0; i <n; i++)
    	{
    		cout << *(arr + i) << ' ';    //arr + i  表示的是地址  并不是值;
    	}
    	cout << endl;
    }
    
    void search(int *p, int *x, int m, int n)
    {
    	int i, j;
    	cout << "The new array is:" << endl;
    	for (i = 0; i < n; i++)
    	{
    		int index = 0;
    		for (j = 0; j < m; j++)
    		{
    			if (p[j] == i) 
    			{
    				index++;               //record the array's number of elements
    			}
    		}
    		output(x, index, i);
    	}
    	cout << endl;
    }
    
    void output(int *p, int index, int i)
    {
    	int l;
    	int k = 0;
    	if (index != 0)
    	{
    		for (l = 0; l < index; l++)      //according index to input new array
    		{
    			p[k] = i;
    			cout << p[k]<<' ';
    			k++;
    		}
    	}
    }
    

    例如以下:
    在这里插入图片描述
    主要是想清楚题目的过程,分析清楚之间的逻辑关系,明白自己定义的变量的含义,由于变量比较多,所以要多注意。

    展开全文
  • 重载一维数组下标很简单,通过下标传入的索引值,返回内部数组中相应的值。那重载二维数组的下标运算呢? 其实重载二维和一维本质是一样的,因为 C/C++ 中所谓的 “二维或多维数组”都是由简单的一维数组表示的...
    写在文章开头的话
    读完这篇文章后,你将学习到下面的知识:
    (1)一个多维数组是如何工作的
    (2)如何重载二维数组下标

    1. 分析


    重载一维数组下标很简单,通过下标传入的索引值,返回内部数组中相应的值。那重载二维数组的下标运算呢?
    其实重载二维和一维本质是一样的,因为 C/C++ 中所谓的 “二维或多维数组”都是由简单的一维数组表示的。举个例子哈:
    下面是两个 int 数组,第(1)个是熟悉的一维数组,第(2)个是熟悉的二维数组,现在你要做的就是将第(2)个数组看成是一个一维数组。
    (1)int array[3];          
    (2)int array[3][4];
    怎么看?可以在头脑中将第(2)个数组数组看成如下定义的方式, 数组 array 包含 3 个元素,其中每个元素又都是一个数组类型(或者说是一个指针类型)。
    typedef int T[4];
    T array[3];

    至于更高维数的数组,也是这样看,比如如下的三维数组,可以采用下面的方式来定义。
    1. int array[3][4][5];  
    2. typedef int T1[5];  
    3. typedef T1 T2[4];  
    4. T2 array[3];  



    由于实际中二维数组用的较多,所以,下面主要是练习二维数组的下标重载。那重载二维数组的下标有什么好处呢?最大的好处就在于可以使代码简洁直观。

    我在网上也看到过一些别人的实现方法,其中在 文章(http://edu.gamfe.com/tutor/d/24416.html)中就提到了一种重载方法,使用一维数组来表示二维数组,这是大多数的实现方法,但是其实现过程过于复杂,其构建了两个类,分别用来获取行和列,然后计算出指定的二维下标对应的内部一维数组的值并返回。

    下面介绍我自己写重载二维下标实现方式,不一定最好,但比上面提到的方式要好。


    2. 重载固定维数的二维数组下标

    对于固定维数的二维数组下标重载,一般在像3D图形方面经常涉及到一些平移转换矩阵时用到,这里以 4 * 4 的矩阵为例,实现代码如下:

    1. struct Matrix4f  
    2. {  
    3.     float m[4][4];  
    4.   
    5.     float * const operator[](const int i)  
    6.     {  
    7.         return m[i];  
    8.     }  
    9. };  

    测试赋值和取值操作,均正常:

    1. Matrix4f m;  
    2.     m[0][0] = 1.0f;  
    3.     m[1][1] = 9.9f;  
    4.     cout << m[0][0] << endl;          // 1  
    5.     cout << m[1][1] << endl;          // 9.9  

    3. 重载维数可变的二维数组下标

    对于可变的二维数组下标重载,在数组初始化时指定维数,之后可以像一般的二维数组进行赋值和取值操作,采用模板实现,代码如下:

    1. template <typename T>  
    2. class Matrix  
    3. {  
    4. public:  
    5.     Matrix(int row, int col)  
    6.         :m_row(row), m_col(col), m_data(nullptr)  
    7.     {  
    8.         m_data = new T[m_row * m_col];  
    9.     }  
    10.   
    11.     ~Matrix()  
    12.     {  
    13.         if (m_data != nullptr)  
    14.         {  
    15.             delete[] m_data;  
    16.             m_data = nullptr;  
    17.         }  
    18.     }  
    19.       
    20.      // 返回二维数组的第 k 行地址,注意加上 const 因为数组地址是不可变的  
    21.     T * const operator[](int k)  
    22.     {  
    23.         return &m_data[k * m_col];  
    24.     }  
    25.   
    26. private:  
    27.     int m_row;  
    28.     int m_col;  
    29.     T *m_data;  
    30. };  

      其中 operator[] 返回 T * const 类型是因为数组首地址是常量,防止非法的赋值操作,例如:

    1. int arr1[3][4];  
    2. int arr2[3][4];  
    3. arr1[0] = arr2[0];           // ERROR!  

    测试赋值和取值操作:

    1. Matrix<int> m2(3, 4);  
    2. m2[0][0] = 2;  
    3. m2[2][3] = 9;  
    4. cout << m2[0][0] << endl;          // 2  
    5. cout << m2[2][3] << endl;          // 9  

    和一般的二维数组一样没有越界检查,所以越界操作也是可以的,但是尽量使用前检查索引是否越界,以免引发未知错误。


    转载请注明出处:http://blog.csdn.net/xiaohui_hubei/article/details/21334141

    展开全文
  • C++重载二维数组下标 [ ][ ]

    千次阅读 2015-04-07 17:31:28
    C++重载二维数组下标 [][]一维数组的重载比较简单,直接参数传入下标值,然后返回指针对应的数值。但是如果是重载二维应该下标[][]应当如何解决?比如我们有 Array2 a(3, 4); int i, j; for (i = 0; i ; ++i) for...
  • 二维数组分别把第一个维下标和最后一个维下标分别作为两个一维数组传给函数作为参数怎么实现?
  • VB二维数组分别把第一个维下标和最后一个维下标分别作为两个一维数组
  • C语言总结第七章、数组一维数组一维数组的定义一维数组的引用一维数组的初始化程序举例二维数组及多维数组二维数组的定义二维数组元素的引用二维数组元素的初始化程序举例字符数组和字符串字符数组 第七章、数组 ...
  • java和c定义二维数组下标省略问题

    千次阅读 2018-02-01 14:27:40
    引用评论区的解释:java中二维数组是数组的数组,数组空间不是连续分配的,所以不要求二维数组一维的大小相同。 二维简单数据类型数组的动态初始化如下: int a[ ][ ] = new int[2][ ]; a...
  • 、数组名与地址 int a[3],大多数早期版本的c语言实现...二、二维数组下标用法 int calendar[12][31]; int *p; int i; calendar[4]当做数组calendar[4]下标为0的数组元素的地址处理,除了sizeof,& i
  • 怎么把一个二维数组按照第一维下标拆分成若干的一维数组,不使用循环语句能实现么,直接参数怎么传?
  • [C++]重载二维数组下标 [ ][ ]实现二维矩阵1. 背景实际项目中,经常需要用到动态分配二维数据。因此经常需要手写循环,来分配和初始化数组。如://首先分配个指针数组 int** array = new int*[m];//然后给指针数组...
  • C#用for循环设置二维数组下标和元素

    千次阅读 2018-04-21 12:08:22
    个意外导致数组中的元素无限循环的实例_https://blog.csdn.net/number1killer/article/details/80021129遍历数组 https://blog.csdn.net/number1killer/article/details/77703289...
  • arr是一个整形一维数组。 #include <stdio.h> int main(){ int arr[] = {1,2,3,4,5,6}; int *p = arr; int len = sizeof(arr) / sizeof(arr[0]); for (int i =1 ;i < len; i++) { printf("%d", *p); ++p; }...
  • #include ... //此处等号右边返回的就是array[1]的地址,用到了操作符重载,p是个指向int类型对象的指针 //step2 p[1] = 1; //此处没有用到操作符重载,别忘了,[]符号本身就对指针具有提领作用 */
  • 例如:构建个maxrownum*maxrownum的矩阵  long double **data1_bfE;    data1_bfE=(long double **)malloc(maxrownum*sizeof(long double *));    for(i=0;imaxrownum;i++)  {  data1_
  • 一维数组实质上是一组相同类型数据的线性集合,是数组中最简单的一种数组。本文将重点介绍一维数组的创建、初始化和使用。 创建一维数组 为了在程序中使用一个数组,必须声明一个引用该数组的变量,并指明整个变量...
  • 一维数组 根据下标和循环进行赋值 public class Demo { public static void main(String[] args) { int[] num=new int[5];//提升性能 int length=num.length; for(int i=0;i<length;i++) { num[i]=i...
  • 给定个整数n,表示数组的个数,依次读数再进行操作。 (数组从0开始读起) #include <iostream> #include<stdio.h> #include<algorithm> using namespace std; int main() { int a[10]; int...
  • 一维数组

    2019-07-19 09:21:49
    下面主要聊一下一维数组、二维数组、字符数组的定义和类型说明符引用、以及字符串处理函数 1.1一维数组 一维数组是C语言中用来存储和处理一维序列数据的数据类型。数组中的所有元素均属于同一种类型。组合使用数组名...
  • C++一维数组的定义 C++中定义一维数组的一般格式: 类型标识符 数组名[常量表达式] 例如: int array[20]; 表示数组名为array,类型为整型数组,有20个元素,读者在定义数组时,需要注意以下4点: 数组名定名规则...
  • 常用的就是一维数组、二维数组。 一维数组 数组定义:数据就是相同数据元素的集合。 数组是一种引用数据类型。不属于基本数据类型。 (1) 如何定义(声明)一维数组? 声明格式:数据类型[] 数组名称; (2) ...
  • 一维数组转二维数组

    千次阅读 2015-05-29 15:32:25
    假设一维数组下标为X,可以把它在逻辑上转换为二维数组的下标:  m = X / 5  n = X % 5  比如你要找第一行第二列的元素,那在一维数组中就是a[1]  转化为二维坐标就是b[0][1]。  其实多维数组和一维数组...
  • 当数组中每个变量只带一个下标时,为一维数组。 定义一个一维数组: 类型名 数组名【常量表达式】 如:int a[8]; 说明: ①定义一个一维整型名为a的数组。  ②方括号中规定此数组有8个元素,(a【0】-a【7】)...
  • 一维数组和二维数组

    2018-05-01 01:51:29
    一维数组:在程序中可以使用下标变量,即说明这些变量的整体为数组,数组的每个变量的数据类型是相同的。 当数组中每个元素都只带有一个下标时,称这样的数组为一维数组。 例:int arr[4]; 这时,我们分析...
  • 数组概述 数组 构造数据类型之一 数组是具有一定顺序关系...所谓一维数组是指只有一个下标的数组。它在计算机的内存中是连续存储的。 C语言中,一维数组的说明一般形式如下: <存储类型> <数据类型 > &...
  • 一维数组与二维数组的区别

    万次阅读 2019-02-25 14:33:30
    当数组中每个元素都只带有一个下标时,称这样的数组为一维数组一维数组实质上是一组相同类型数据的线性集合 举例:a(10),表示的就是a(0)到a(10)之间的十一组数据的集合,数据元素可以是数字,也可以是字符串。 ...
  • 【C语言】一维数组和二维数组

    千次阅读 2017-07-10 09:43:54
    一维数组及二维数组

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,361
精华内容 39,344
关键字:

一维数组下标