精华内容
下载资源
问答
  • C++ vector 实现二维数组

    千次阅读 2019-09-03 13:21:38
    (1) vector<int> a(10); //定义了10个整型元素向量(尖括号中为元素类型名,它可以是任何合法数据类型),但没有给出初值,其值是不确定。 (2)vector<int> a(10,1); //定义了10个整型元素...

    (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
    (2)vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
    (3)vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
    (4)vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
    (5)int b[7]={1,2,3,4,5,9,8};vector<int> a(b,b+7); //从数组中获得初值

     

    在STL中Vector这一容器,无论是在封装程度还是内存管理等方面都由于传统C++中的数组。本文主要是关于使用Vector初始化、遍历方面的内容。其他二维的思想也是类似的。

    这里简单叙述一下C++ 构建二维动态数组

    int **p;
    p = new int*[10];    //注意,int*[10]表示一个有10个元素的指针数组
    for (int i = 0; i < 10; ++i)
    {
        p[i] = new int[5];
    }

    定义一个二维整形数组并初始化:

    vector<vector<int> > array(m); //这个m一定不能少//vector<int> array[m];
    //初始化一个m*n的二维数组
    for(int i=0;i<m;i++) 
    {
        array[i].resize(n);
    }
    //遍历赋值
    for(i = 0; i < array.size(); i++)
    {
       for (j = 0; j < array[0].size();j++) 
        {   
            array[i][j] = (i+1)*(j+1); 
        } 
    }

    例子

    int main()
    {
        int i = 0, j = 0;
    	vector< vector<int> > maze(8, vector<int> (12, 0));    
        int A[8][12] = {{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
                        { 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1 },
                        { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1 },
                        { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1 },
                        { 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 },
                        { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
                        { 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
                        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
                       };
        int m, n;
        for(m = 0; m < maze.size(); m++)
        {
            for(n = 0; n < maze[m].size(); n++)
            {
                maze[m][n] = A[m][n];
                cout << maze[m][n] << " ";
            }
            cout << "\n";
        }
     
    }

     

    展开全文
  • 只知道行数,不知道列数: 初始化: vector<vector<...初始化要注意不能使用M[i][j]=xx,的赋值语句,因为会超出数组的界限,只能用push_back,增加列的长度。 只知道列数,不知道行数...

     

    只知道行数,不知道列数:

    初始化:

    vector<vector<int>>b(row, vector<int>(0));
    
    
    vector<vector<int>>b(10, vector<int>(0));//10行

    赋值:

    b[1].push_back(5);

    初始化要注意不能使用M[i][j]=xx,的赋值语句,因为会超出数组的界限,只能用push_back,增加列的长度。

     

     

    只知道列数,不知道行数的话,需要转换思维,将代码中 row 理解成列数,vector<int>(0) 动态插入行数

    就是将已知边界放在首位,未知的边界动态插入

    展开全文
  • C++ vector 实现二维数组赋值 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一...

    关于二维数组,在我的概念里只有 a[i][j] 类似的样子,今天刷了一次剑指offer,使用C++编程,里面要求使用vector容器,虽然听说过,但没有使用过,查阅了一些资料,有了基础,就可以开始尝试。

    C++ vector的用法(整理)
    C++ vector 实现二维数组,赋值

    题目描述:
    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    模板为:

    class Solution {
    public:
        bool Find(int target, vector<vector<int> > array) {
           
        }
    };
    

    暴力求解:
    我的第一个思路就是直接搜索二维数组,暴力求解,最坏的情况时间复杂度为O(n^2)。
    (虽说简单,需要注意的是在读取数组时,应先判断数组是否为空,我觉得这样可以节省一定时间)

    bool Find(int target, vector<vector<int> > array) {
            //判断数组是否为空
            if(array.size() == 0 || array[0].size() == 0)
                return false;
            for(int i = 0; i < array.size(); i++)
            {
                for(int j = 0; j < array[i].size(); j++)
                    if(target == array[i][j])
                        return true;
            }
            return false;
        }
    

    二分法求解:
    我们还有已知条件还没有用——数组从左到右递增,从上到下递增,怎样可以更快呢,那就可以使用二分法将需要查找的范围逐步减半,这样更可以节省时间,提高效率。(先把判断数组是否为空养成习惯)

    bool Find(int target, vector<vector<int> > array) {
            if (array.size() == 0 || array[0].size() == 0)
                return false;
            for (int i = 0; i < array.size(); i++)
            {
                //从每行最大值与target判断,有可能直接跳过某行
                int high = array[i].size() - 1;
                if (array[i][high] < target)
                    continue;
                else if (array[i][high] == target)
                    return true;
                else if (array[i][high] > target)
                {
                    int low = 0;
                    int mid = 0;
                    while (low <= high)
                    {
                        mid = (low + high) / 2;
                        if (array[i][mid] == target)
                            return true;
                        else if (array[i][mid] > target)
                        {
                            high = mid - 1;
                        }
                        else if (array[i][mid] < target)
                        {
                            low = mid + 1;
                        }
                    }
                }
            }
            return false;
        }
    

    在编写二分法的过程中需要注意low和high变量的赋值,可能稍有不慎就会陷入死循环。
    而且千万不要把这个二维数组当作一维来处理,因为可能后行前面的数字比前行后面几个数字还大,这样就不是一维排序的数组了。

    展开全文
  • 第一次写文章,感觉好奇怪。初学C++,用刚学的类写个小程序主要问题: 1....同时如何创建二维数组,且如何传递,主要是二维数组的类型。 2.初始化构造函数、赋值构造函数和重载=之间的联系。 3.VScode怎...

    第一次写文章,感觉好奇怪。

    初学C++,用刚学的类写个小程序

    主要问题:

    1.需要根据输入确定矩阵大小,所以需要用new给类的私有成员申请空间。同时如何创建二维数组,且如何传递,主要是二维数组的类型。

    2.初始化构造函数、赋值构造函数和重载=之间的联系。

    3.VScode怎么同时编译多个文件。

    一、new与二维数组

    1.数据类型:首先看一维数组,想传地址直接取数组名就好,比如:

    int sz[100];
    int *p=sz;//之后p就能当数组用了
    

    那么照这么搞,二维数组的地址是不是可以表示成 int **p? 很遗憾不能。和C一样,C++按行分配内存块,所以编译器可以不知道你要多少行,但是必须要知道你每行的长度是多少,不然没法分配内存。一个3X2数组的地址:

    ed5796c08bce86cc761f4d738c29fd2f.png
    显然这样能保证行与行之间是连续的

    所以对于一个二维数组,它的数组名(地址)的数据类型实际上是 (int (*)[n]),其中n是列数,也就是说,不同列数的数组他们的数组地址不是同一种类型的,他们不能混用!尽管我们可以用 a[i][j] = *(a[i] + j) = *(*(a+i)+j) 表示二维数组, 但让 int **p=a,是一定会报错的,因为尽管a和p似乎都是 指向 int的指针 的指针,但是前者在定义二维数组之后使用,编译器知道它是一个列数为n的二维数组的地址,而后者只是一个Int被指了两边,所以当你试图用p去接a的值时(比如函数形参),编译器会提示类型错误。

    那如果x还想用指针传递二维数组该怎么办呢,其实很简单,这要告诉编译器“这不仅是一个指针,而且你需要按n列的二维数组去读取它“就行了。直接强转:

    void hhh(int **ptr,int n) //理论上ptr是任何可以表示地址的类型都可以
    {
        int (*temp)[n] =(int (*)[n])ptr; //编译器告诉我要这么转
        cout<<temp[0][0]<<endl;
    }
    

    这样就能正常n将temp当s二维数组用了。这里之所以能在列数处用变量是因为语句只是说明了声明和转换类型,并没有去申请长为n的内存空间。

    2.用new分配二维数组内存。

    当然这时我们已经根据输入知道了到底要分配多少列了

    一种流行的写法是:(单独申请每一行,地址是不连续的)

        double **mtrx = new double *[heit];  
        for(i=0; i<heit; ++i)  
            mtrx[i] = new double[wid];  
        //mtrx是个地址。什么地址?一片连续数据的地址。上面存的啥?每行的首地址。每行的首地址上有啥?
        //一片an'aip连续的数据,有wid*sizeof(type)这么长,具体一块就是数组的具体元素。
    

    但我们根据前面的描述不难想到:

    int (*temp)[2]=new int [3][2];
    delete[] temp;
    

    这样的一个好处是内存是连续的:(虽然好像没什么用)

    5323b684d369d0b3d16965299a1be4e7.png

    当然你也可以用强转把new申请的内存地址转了,然后用你喜欢的表示方法把数取出来(比如两次一维数组),总之地址在那数据空间也在那。

    二、构造函数、赋值构造函数和重载“=”

    我定义了:

    class Matrix
    {
     private:
        int len;
        int row;
        bool valueflag;
        double **mtrx;//用于存储二维数组申请的地址
     public:
        void build2Darry(int row,int len);//用new获得2D空间
        void getvalue(double **p);        //赋予矩阵值
        void show();                      //矩阵内容显示
        Matrix();                         //默认初始化
        Matrix(int x,int y);              //自定义初始化
        Matrix(const Matrix &);           //复制构造函数
        ~Matrix();                        //析构函数
        //重载运算符
        Matrix & operator=(const Matrix &); //矩阵赋值
        Matrix  operator*(const Matrix &);  //矩阵乘矩阵
        Matrix  operator*(const double &);  //矩阵乘常数
        //友元
        friend Matrix operator*(const double ,const Matrix &);//常数乘矩阵
    };
    

    当使用类似

    Matrix ANS=mat1*mat2 时:

    对mat1、mat2应用重载乘法 ->【复制(先默认构造)得到的结果】->使用重载=赋值给左边的量(先默认构造)

    【】中的可能由于类的实现过程已经进行了复制,所以可能没有。

    但就算表达式再简单,这些基本构造函数还是都该写成deepcopy的,不然如果用重载的话,指不定C++在哪给你临时调用一个,然后删除的时候就会重复删除。然后就是注意返回引用的话不能返回临时变量。

    三、VScode 多文件编译

    之前用弟弟Keil的时候只会点build all,这下得学怎么cmake了

    建议百度看这个cmake_tutorial

    刚学也不会啥骚操作,反正能编译出来就行了:

    project(MATRIX)
    set(SRC_LIST matrix.cpp matrixf.cpp)
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
    add_executable(matrix ${SRC_LIST})
    展开全文
  • 目录数组的存储与初始化一维数组的存储一维数组的初始化二维数组的存储二维数组的初始化数组作为函数的参数对象数组对象数组的定义和访问对象数组的初始化数组元素所属类的构造函数基于范围的for循环指针的初始化和...
  • sort函数默认可以实现顺序容器从小到大排序,那么从大到小呢,若容器为二维容器,那么还能使用sort排序吗? 1. 默认从小到大排序 vector<int> vec; //赋值 // //... sort(vec.begin(),vec.end()); 2. 从...
  • 三数之和解题思路知识点代码实现小结 给定一个包含 n 个整数数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?...利用 vector 容器来定义二维数组以及赋值操作等; 代...
  • 现代C++程序设计

    2012-07-10 23:29:45
    6.5.1 二维数组的初始化 6.5.2 嵌套的for循环和二维数组 6.5.3 利用二维数组来实现Bingo游戏 6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 ...
  • 6.5.1 二维数组的初始化 6.5.2 嵌套的for循环和二维数组 6.5.3 利用二维数组来实现Bingo游戏 6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 ...
  • 最后,读者将学习如何创建二维数组以及如何使用嵌套循环来处理它们。 第6章:分支语句和逻辑操作符 如果程序可以根据实际情况调整执行,我们就说程序能够智能地行动。在本章,读者将了解到如何使用if 、if else...
  • 最后,读者将学习如何创建二维数组以及如何使用嵌套循环来处理它们。 第6章:分支语句和逻辑操作符 如果程序可以根据实际情况调整执行,我们就说程序能够智能地行动。在本章,读者将了解到如何使用if 、if else...
  • 最后,读者将学习如何创建二维数组以及如何使用嵌套循环来处理它们。 第6章:分支语句和逻辑操作符 如果程序可以根据实际情况调整执行,我们就说程序能够智能地行动。在本章,读者将了解到如何使用if 、if else...
  • 最后,读者将学习如何创建二维数组以及如何使用嵌套循环来处理它们。 第6章:分支语句和逻辑操作符 如果程序可以根据实际情况调整执行,我们就说程序能够智能地行动。在本章,读者将了解到如何使用if 、if else...
  • 5.6 嵌套循环和二维数组 5.6.1 初始化二维数组 5.6.2 使用二维数组 5.7 总结 5.8 复习题 5.9 编程练习 第6章 分支语句和逻辑运算符 6.1 if语句 6.1.1 if else语句 6.1.2 格式化if else语句 6.1.3 if else...
  • C++ Primer Plus 中文版 第4版 清晰版

    千次下载 热门讨论 2009-12-06 14:45:21
    5.6 嵌套循环和二维数组 133 5.6.1 初始化二维数组 134 5.7 总结 136 5.8 复习题 136 5.9 编程练习 137 第6章 分支语句和逻辑操作符 139 6.1 if语句 140 6.1.1 if else语句 141 6.1.2 格式化if ...
  • 5.1.6二维数组的使用207 5.1.7for~each循环208 5.1.8应用程序示例1——数组排序209 5.1.9应用程序示例2——杨辉三角212 5.2字符串213 5.2.1String对象的声明213 5.2.2String对象的创建214 5.2.3String对象的...
  • java范例开发大全(pdf&源码)

    热门讨论 2013-07-04 13:04:40
    实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 矩阵的减法 98 实例73 快递报价单 99 5.3 数组的排序 101 实例74 冒泡排序法 ...
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
     实例67 二维数组的创建与使用 92  实例68 矩阵转置 93  实例69 奇数阶幻方 94  实例70 求方阵对角线之和 96  实例71 矩阵的加法 97  实例72 矩阵的减法 98  实例73 快递报价单 99  5.3 数组的排序 ...
  • 4.3.3 二维数组111 4.4 经典算法113 4.4.1 算法-冒泡排序113 4.4.2 插入排序115 4.5 增强for循环116 4.6 本章练习117 第5章 5.1 面向过程设计思想120 5.2 面向对象设计思想120 5.3 抽象121 5.3.1 对象理解121 ...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
     实例67 二维数组的创建与使用 92  实例68 矩阵转置 93  实例69 奇数阶幻方 94  实例70 求方阵对角线之和 96  实例71 矩阵的加法 97  实例72 矩阵的减法 98  实例73 快递报价单 99  5.3 数组...
  • 算法笔记 胡凡 曾磊

    2018-10-16 17:38:13
    39 2.5.2 冒泡排序 41 2.5.3 二维数组 43 2.5.4 memset——对数组中每一个元素赋相同值 46 2.5.5 字符数组 47 2.5.6 string.h头文件 50 2.5.7 sscanf与sprintf 53 2.6 函数 55 2.6.1 函数定义 55 2.6.2 再谈main...
  • java范例开发大全

    2013-03-08 20:06:54
    实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 矩阵的减法 98 实例73 快递报价单 99 5.3 数组的排序 101 实例74 冒泡排序法 ...
  • 2.5.3 二维数组 43 2.5.4 memset——对数组中每一个元素赋相同值 46 2.5.5 字符数组 47 2.5.6 string.h头文件 50 2.5.7 sscanf与sprintf 53 2.6 函数 55 2.6.1 函数定义 55 2.6.2 再谈main函数 58 2.6.3 以数组...
  • 维数组--小结 38 JAVA基本语法--排序 38 排序介绍 38 冒泡法程序演示 38 选择式排序法--选择排序法 38 插入式排序法--插入排序法 39 交换式排序法--快速排序法 39 其它排序法--选堆排序法 40 其它排序法--希尔...
  • Java范例开发大全(全书源程序)

    热门讨论 2013-04-05 11:50:26
    实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 矩阵的减法 98 实例73 快递报价单 99 5.3 数组的排序 101 实例74 冒泡...
  • C++捷径教程(第3版)

    千次下载 热门讨论 2008-03-24 02:24:59
    69 5.4 二维数组 70 5.5 多维数组 71 5.6 数组初始化 72 5.7 字符串数组 75 第6章 指针 79 6.1 什么是指针 79 6.2 指针运算符 80 6.2.1 基本类型重要性 81 6.2.2 通过指针赋值 82 ...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

vector实现二维数组的赋值