鱼C论坛

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

二维数组的定义

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

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

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

x
vector<vector<double>> m_startAndEndVec;
vector<vector<double> > tmp_m_startAndEndVec(m_startAndEndVec);
请问这算什么定义呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-9 16:41:03 | 显示全部楼层
就是一个简单的容器的嵌套  严格上不能称为二维数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这样嵌套之后,他的容量是多大呢?不是二维数组嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

vector容器的大小是不定长的。
#include <stdio.h>
#include <vector>
#include <iostream.h>

int main(void)
{
        //定义一个一维数组
        std::vector<double> array_1D;
        //定义一个二位数组
        std::vector<std::vector <double> > array_2D;
        
        //给一维数组中添加10个元素
        for(int i = 0 ; i < 10 ; i ++)
        {
                array_1D.push_back(i);
        }
        
        //给二维数组中添加一个一维数组
        array_2D.push_back(array_1D);

        for(i = 0 ; i < 10 ; i ++)
        {
                array_1D[i] = i * i;
        }
        //给二维数组中再添加一个一维数组
        array_2D.push_back(array_1D);
        
        //以下标方式访问二维数组,将数组中的每个元素输出
        for(i = 0 ; i < 2 ; i ++)
        {
                for(int j = 0 ; j < 10 ; j ++)
                {
                        cout << array_2D[i][j] << ",";
                }
                cout << endl;
        }
        
        //清空一维数组
        array_1D.clear();
        //给一维数组中添加11个元素
        for(i = 0 ; i <= 10 ; i++)
        {
                array_1D.push_back(i * i * i);
        }
        
        //给二维数组中再添加一个一维数组
        array_2D.push_back(array_1D);

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

        for(VVI vvi = array_2D.begin() ; vvi != array_2D.end() ; vvi ++)
        {
                for(VI vi = vvi->begin() ; vi != vvi->end() ; vi ++)
                {
                        cout << * vi << ",";
                }
                cout << endl;
        }

        return 0;        
}

可以在定义时指定长度,但它依然可以变长
        //定义一个已经包含10个元素的一维数组,并把每一个元素初始化为1.0
        std::vector<double> array_1D(10,1.0);
        //定义一个包含5个元素的二维数组。
        std::vector<std::vector <double> > array_2D(5);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我不太懂的点是“定义一个二维数组里面放的是另外一个二维数组”,那定义出来的二维数组是个什么样子的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


做个简单的比方,定义一个类
class aaa
{
   public:
          aaa(){m_a = 0;}
         ~aaa(){}
         aaa(const aaa & b){ m_a = b.m_a;}
         aaa & operator = (const aaa & b) { m_a = b.m_a; return * this;}
  private:
   int m_a;
}

用这个类定义两个对象
aaa a;
aaa b(a);
相当于 b = a;
vector<vector<double>> m_startAndEndVec;
vector<vector<double> > tmp_m_startAndEndVec(m_startAndEndVec);
这样的语法同理, tmp_m_startAndEndVec 相当于 m_startAndEndVec 的一个拷贝。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

容器的长度是根据添加元素个数决定的 具体分配的大小 你可以写代码  用size和capacity测一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

一个简单的数组类的实现,你可以看一下。
template <typename T>
class CMyArray  
{
public:
        CMyArray()
        {
                m_nCount = 0;
                m_pBuffer = NULL;
        }

        ~CMyArray()
        {
                safeRelease();
        }
        
        //这个叫拷贝构造函数
        CMyArray(const CMyArray<T> & arr)
        {
                m_nCount = arr.m_nCount;
                m_pBuffer = NULL;

                if(m_nCount > 0)
                {
                        m_pBuffer = new T[m_nCount];
                        for(long i = 0 ; i < m_nCount ; i ++)
                        {
                                m_pBuffer[i] = arr.m_pBuffer[i];
                        }
                }
        }
        
        CMyArray & operator = (const CMyArray & arr)
        {
                m_nCount = arr.m_nCount;
                safeRelease();
                if(m_nCount > 0)
                {
                        m_pBuffer = new T[m_nCount];
                        for(long i = 0 ; i < m_nCount ; i ++)
                        {
                                m_pBuffer[i] = arr.m_pBuffer[i];
                        }
                }
                return * this;
        }

        T & operator[](long index)
        {
                return m_pBuffer[index];
        }

        void push_back(const T & t)
        {
                int count = m_nCount++;
                T * temp = new T[m_nCount];
                
                for(int i = 0 ; i < count ; i ++)
                {
                        temp[i] = m_pBuffer[i];
                }
                
                temp[count] = t;
                safeRelease();
                m_pBuffer = temp;
        }
private:
        void safeRelease()
        {
                if(m_pBuffer != NULL)
                {
                        delete [] m_pBuffer;
                        m_pBuffer = NULL;
                }
        }
private:
        long m_nCount;
        T * m_pBuffer;
};
int  main(void)
{
        CMyArray<double> array_1D;

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

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

        d = temp[0][8];

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 21:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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