鱼C论坛

 找回密码
 立即注册
查看: 2778|回复: 8

二维数组的定义

[复制链接]
发表于 2020-10-9 16:31:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
vector<vector<double>> m_startAndEndVec;
vector<vector<double> > tmp_m_startAndEndVec(m_startAndEndVec);
请问这算什么定义呀?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-9 16:41:03 | 显示全部楼层
就是一个简单的容器的嵌套  严格上不能称为二维数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 15:26:59 | 显示全部楼层
tttxiaoz 发表于 2020-10-9 16:41
就是一个简单的容器的嵌套  严格上不能称为二维数据

这样嵌套之后,他的容量是多大呢?不是二维数组嘛?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 16:54:26 | 显示全部楼层
本帖最后由 xieglt 于 2020-10-10 17:01 编辑

vector容器的大小是不定长的。


  1. #include <stdio.h>
  2. #include <vector>
  3. #include <iostream.h>

  4. int main(void)
  5. {
  6.         //定义一个一维数组
  7.         std::vector<double> array_1D;
  8.         //定义一个二位数组
  9.         std::vector<std::vector <double> > array_2D;
  10.        
  11.         //给一维数组中添加10个元素
  12.         for(int i = 0 ; i < 10 ; i ++)
  13.         {
  14.                 array_1D.push_back(i);
  15.         }
  16.        
  17.         //给二维数组中添加一个一维数组
  18.         array_2D.push_back(array_1D);

  19.         for(i = 0 ; i < 10 ; i ++)
  20.         {
  21.                 array_1D[i] = i * i;
  22.         }
  23.         //给二维数组中再添加一个一维数组
  24.         array_2D.push_back(array_1D);
  25.        
  26.         //以下标方式访问二维数组,将数组中的每个元素输出
  27.         for(i = 0 ; i < 2 ; i ++)
  28.         {
  29.                 for(int j = 0 ; j < 10 ; j ++)
  30.                 {
  31.                         cout << array_2D[i][j] << ",";
  32.                 }
  33.                 cout << endl;
  34.         }
  35.        
  36.         //清空一维数组
  37.         array_1D.clear();
  38.         //给一维数组中添加11个元素
  39.         for(i = 0 ; i <= 10 ; i++)
  40.         {
  41.                 array_1D.push_back(i * i * i);
  42.         }
  43.        
  44.         //给二维数组中再添加一个一维数组
  45.         array_2D.push_back(array_1D);

  46.                
  47.         //因为一维数组的长度不一致,用下标方式访问不方便,可以用指针方式访问数组
  48.         typedef std::vector<std::vector <double> >::iterator VVI;
  49.         typedef std::vector<double>::iterator VI;

  50.         for(VVI vvi = array_2D.begin() ; vvi != array_2D.end() ; vvi ++)
  51.         {
  52.                 for(VI vi = vvi->begin() ; vi != vvi->end() ; vi ++)
  53.                 {
  54.                         cout << * vi << ",";
  55.                 }
  56.                 cout << endl;
  57.         }

  58.         return 0;       
  59. }
复制代码


可以在定义时指定长度,但它依然可以变长

  1.         //定义一个已经包含10个元素的一维数组,并把每一个元素初始化为1.0
  2.         std::vector<double> array_1D(10,1.0);
  3.         //定义一个包含5个元素的二维数组。
  4.         std::vector<std::vector <double> > array_2D(5);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-12 14:13:28 | 显示全部楼层
xieglt 发表于 2020-10-10 16:54
vector容器的大小是不定长的。

我不太懂的点是“定义一个二维数组里面放的是另外一个二维数组”,那定义出来的二维数组是个什么样子的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-12 14:14:00 | 显示全部楼层
内裤里有糖吃 发表于 2020-10-12 14:13
我不太懂的点是“定义一个二维数组里面放的是另外一个二维数组”,那定义出来的二维数组是个什么样子的。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-12 14:40:43 | 显示全部楼层
本帖最后由 xieglt 于 2020-10-12 14:50 编辑
内裤里有糖吃 发表于 2020-10-12 14:13
我不太懂的点是“定义一个二维数组里面放的是另外一个二维数组”,那定义出来的二维数组是个什么样子的。


做个简单的比方,定义一个类

  1. class aaa
  2. {
  3.    public:
  4.           aaa(){m_a = 0;}
  5.          ~aaa(){}
  6.          aaa(const aaa & b){ m_a = b.m_a;}
  7.          aaa & operator = (const aaa & b) { m_a = b.m_a; return * this;}
  8.   private:
  9.    int m_a;
  10. }
复制代码


用这个类定义两个对象


  1. aaa a;
  2. aaa b(a);
复制代码

相当于 b = a;


  1. vector<vector<double>> m_startAndEndVec;
  2. vector<vector<double> > tmp_m_startAndEndVec(m_startAndEndVec);
复制代码

这样的语法同理, tmp_m_startAndEndVec 相当于 m_startAndEndVec 的一个拷贝。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-12 15:23:36 | 显示全部楼层
内裤里有糖吃 发表于 2020-10-10 15:26
这样嵌套之后,他的容量是多大呢?不是二维数组嘛?

容器的长度是根据添加元素个数决定的 具体分配的大小 你可以写代码  用size和capacity测一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-12 15:36:36 | 显示全部楼层
本帖最后由 xieglt 于 2020-10-12 15:50 编辑

一个简单的数组类的实现,你可以看一下。

  1. template <typename T>
  2. class CMyArray  
  3. {
  4. public:
  5.         CMyArray()
  6.         {
  7.                 m_nCount = 0;
  8.                 m_pBuffer = NULL;
  9.         }

  10.         ~CMyArray()
  11.         {
  12.                 safeRelease();
  13.         }
  14.        
  15.         //这个叫拷贝构造函数
  16.         CMyArray(const CMyArray<T> & arr)
  17.         {
  18.                 m_nCount = arr.m_nCount;
  19.                 m_pBuffer = NULL;

  20.                 if(m_nCount > 0)
  21.                 {
  22.                         m_pBuffer = new T[m_nCount];
  23.                         for(long i = 0 ; i < m_nCount ; i ++)
  24.                         {
  25.                                 m_pBuffer[i] = arr.m_pBuffer[i];
  26.                         }
  27.                 }
  28.         }
  29.        
  30.         CMyArray & operator = (const CMyArray & arr)
  31.         {
  32.                 m_nCount = arr.m_nCount;
  33.                 safeRelease();
  34.                 if(m_nCount > 0)
  35.                 {
  36.                         m_pBuffer = new T[m_nCount];
  37.                         for(long i = 0 ; i < m_nCount ; i ++)
  38.                         {
  39.                                 m_pBuffer[i] = arr.m_pBuffer[i];
  40.                         }
  41.                 }
  42.                 return * this;
  43.         }

  44.         T & operator[](long index)
  45.         {
  46.                 return m_pBuffer[index];
  47.         }

  48.         void push_back(const T & t)
  49.         {
  50.                 int count = m_nCount++;
  51.                 T * temp = new T[m_nCount];
  52.                
  53.                 for(int i = 0 ; i < count ; i ++)
  54.                 {
  55.                         temp[i] = m_pBuffer[i];
  56.                 }
  57.                
  58.                 temp[count] = t;
  59.                 safeRelease();
  60.                 m_pBuffer = temp;
  61.         }
  62. private:
  63.         void safeRelease()
  64.         {
  65.                 if(m_pBuffer != NULL)
  66.                 {
  67.                         delete [] m_pBuffer;
  68.                         m_pBuffer = NULL;
  69.                 }
  70.         }
  71. private:
  72.         long m_nCount;
  73.         T * m_pBuffer;
  74. };
复制代码

  1. int  main(void)
  2. {
  3.         CMyArray<double> array_1D;

  4.         for(long i = 0 ; i < 10 ; i ++)
  5.         {
  6.                 array_1D.push_back(i);
  7.         }

  8.         CMyArray<CMyArray <double> > array_2D;
  9.         array_2D.push_back(array_1D);
  10.        
  11.         double d = array_2D[0][5];
  12.         //这就是你所说的那个语法
  13.         CMyArray<CMyArray <double> > temp(array_2D);

  14.         d = temp[0][8];

  15.         return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-18 19:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表