精华内容
下载资源
问答
  • 如果是普通的数组,可以类似下面的代码获取标准差: double a[100]; double s = StdDev(a,100);...可目前,数组大小不定,怎么改成动态数组(DynamicArray)来使用这个函数,请大家帮帮忙。
  • 如果你过R语言,那么一定过向量,如果Python,那么一定过列表。那么问题来了,这两类数据结构有什么区别呢?为什么Python的列表,支持存放不同类型的数据,而R语言的向量只能放同一个类型的数据呢?还有,为...

    如果你用过R语言,那么一定用过向量,如果用Python,那么一定用过列表。那么问题来了,这两类数据结构有什么区别呢?

    为什么Python的列表,支持存放不同类型的数据,而R语言的向量只能放同一个类型的数据呢?还有,为什么R语言的向量化运算函数(如sum, nchar)速度会显著性高于R的循环呢?

    对于下面的R代码,那种循环更好呢?# loop 1a 

    }# loop 2a 

    a[i] = i

    }

    要想解答这些问题,就必须得学习一下数组。数组是一种线性表数据结构,他在一段连续内存空间中存储相同大小的元素。这里有两个关键点,第一是线性表,也就是说数组里面的元素只有前后关系,同样属于线性表数据结构的还有链表、队列和栈,与之相反的是非线性表数据结构,例如树和图。

    线性表和非线性表

    第二是连续内存,且里面的元素大小相同,这样子当知道数组的第一个元素的内存位置时,就可以迅速计算出第n个元素的内存地址,并获取该地址的存储内容。

    随机访问

    有利就有弊。由于数组要占用一组连续的内存空间,当你要存储的数据要占据非常大的空间时,就会面临内存中找不到位置的尴尬情形。此外,为了保证数据存储的连续性,那么在你插入和删除数据的时候都要进行额外的数据移动操作,这些操作的时间复杂度是

    。如果数据已经满了,那么加入新的数据时就需要在内存中申请新的空间,同时将现有数据迁移过去。

    插入操作

    尽管如此,数组依旧是最常用的数据结构,毕竟数组和CPU和缓存机制非常契合,在数据处理上效率较高。

    在C语言中,数组的声明方式有如下方法:float averages[200]; //在内存中预留200个位置char word[] = { 'H', 'e', 'l', 'l', 'o', '!'}; // 让C自动确定数组的大小char *words[] = {"hello", "world"}; 字符串数组

    此外,指针与数组的关系十分密切,一般能用数组下标实现的操作,都能用数组完成。过去的时候,指针操作的速度会快于数组下标操作,但是随着编译器的优化,基本上两者的性能持平了。考虑指针实现的程序理解比较困难,因此更推荐用数组。示例:int a[10]; //声明一个长度为10的存放整型的数组int *pa;  //声明一个指向整型的指针pa = &a[0]; // 将数组a的起始地址赋值给指针//等价于 pa = a;

    那么a[i]  等价于 *(pa + i ) ,  无论数组a中元素的类型或数组长度是什么,该结论始终成立。 ”指针加1“就意味着pa + 1 指向pa所指向对象的下一个对象。简而言之,一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现。

    但是,指针和数组还是有区别的,指针是一个变量,数组名不是变量。在函数定义中,形式参数char s[]; 和char *s 是等价的,这是因为把数组名传递给函数时,实际传递的时该数组的第一个元素的地址。

    R语言的向量和Python的列表还不是普通的数组,因为他们的大小可变,同样特点的还有C++的标准库类型vector, 还有Java的ArrayList和Vector类,都支持动态进行扩容。举个C++的例子#include #include using std::cin;using std::vector;string word;vector  text;while (cin >> word){

    text

    }

    当然C语言本身并没有这个功能,所以我就尝试着自己写了一个非常简单的实现,依旧分为两个头文件和C文件。

    darray.h如下:#ifndef _DARRAY_H                                           #define _DARRAY_H

    typedef unsigned int position;

    /* define the data struct */                                typedef struct _cell cell;                                  typedef struct _darray darray;

    /* define the manipulate function of darray */

    darray *dCreate(char *strings[], int ssize);

    darray *dInsert(darray *d, position pos, char *string);

    darray *dExpand(darray *d, int ssize);

    void dDestroy(darray *d);

    void dRemove(darray *d, position pos);

    void dPrint(darray *d);

    #endif

    darray.c:#include #include #include "dbg.h"#include "darray.h"// 用deleted标注删除,不做实际的搬移操作enum status {empty, deleted, legitimate };typedef struct _cell {

    enum status info;    char *string ;

    } cell;typedef struct _darray{

    int size;    int load;

    cell *cells;

    } darray;// 根据初始大小申请内存darray *dCreate(char *strings[], int ssize){

    darray *d;

    d = malloc(sizeof(darray));

    d->size = 2 * ssize;

    d->load = 0;

    d->cells = calloc(d->size, sizeof(cell));

    // initialize the array

    int i;    for (i = 0; i 

    d->cells[i].info = legitimate;

    d->cells[i].string = strings[i];

    d->load ++;

    }

    debug("i shoule be %d", i);    for (; i size; i++){

    d->cells[i].info = empty;

    }    return d;

    }//进行扩容darray *dExpand(darray *d, int ssize){

    darray *newArray;

    newArray = malloc(sizeof(darray));

    newArray->size = 2 * ssize;

    newArray->cells = calloc(newArray->size, sizeof(cell));

    newArray->load = 0;    int i;    int j = 0;        //复制元素

    for (i = 0; i size; i++){        if( d->cells[i].info == legitimate){

    newArray->cells[j].string = d->cells[i].string;

    debug("new arrys cell %d is %s", j, newArray->cells[j].string);

    newArray->cells[j].info = legitimate;

    newArray->load++ ;

    j++ ;

    }

    }    for (; j size; j++){

    newArray->cells[j].info = empty;

    }        //释放原来的内存

    dDestroy(d);    return newArray;

    }//插入操作darray *dInsert(darray *d, position pos, char *string){    if (d->load + 1 > d->size ){

    d = dExpand(d, d->size);

    }    if (pos > d->size ){

    d = dExpand(d, pos);

    }

    debug("size of darray is %d", d->size);    if ( d->cells[pos].info == deleted ||

    d->cells[pos].info == empty){

    d->cells[pos].info = legitimate;

    d->cells[pos].string = string;

    } else{        int i = d->size;

    d->cells[i].info = legitimate;        for (; i > pos; i--){

    d->cells[i].string = d->cells[i-1].string;

    }

    d->cells[pos].string = string;

    }    return d;

    }//删除操作void dRemove(darray *d, position pos){

    d->cells[pos].info = deleted;

    }//输出元素void dPrint(darray *d){    int i = 0;    for (i = 0; i size; i++){        if ( d->cells[i].info == legitimate)            printf("%d \t %s \n", i, d->cells[i].string);

    }    putchar('\n');

    }void dDestroy(darray *d){    free(d->cells);    free(d);

    }int main(int argc, char *argv[]){

    darray *test;    char *input[] = {"hello", "my", "world","!"} ;

    test = dCreate(input, 4);

    dPrint(test);    char *h = "hello";

    test = dInsert(test, 10, h);

    dPrint(test);

    dRemove(test,1);

    dPrint(test);

    dDestroy(test);    return 0;

    }目前代码还存在一些问题,因为我只是将元素标记了删除,那么后续删除同一个位置时需要向后移动才行。同样插入操作也会存在bug。但是能这样子写代码对之前只能hello world的我已经是很大进步了。

    解答开篇: Python的列表中存放的是元素的引用,并非元素本身,因此可以放任意类型的数据,其实和R语言的list更加对应。而R语言的向量则更加接近数组结构。

    当你使用a

    作者:hoptop

    链接:https://www.jianshu.com/p/ec5f727e5650

    展开全文
  • 数据的定义有两种方式:一般情况我们第一种// 定义了一个int型的数组,变量名是arrint[] arr//定义了一个int变量,变量是arr数组int arr[]我们用数组动态初始化和静态初始化举个栗子:package com.codetest;...

    数据的定义有两种方式:一般情况我们用第一种

    // 定义了一个int型的数组,变量名是arrint[] arr
    // 定义了一个int变量,变量是arr数组int arr[]

    我们用数组动态初始化和静态初始化举个栗子:

    package com.codetest;

    public class arraydemo {
        public static void main(String[] args) {

            // 数组动态初始化
            int[] arr = new int[111];

            System.out.println(arr);
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[1]);

            // 数组静态初始化
            int[] arr1 = {3,4,5};
            System.out.println(arr1);
            System.out.println(arr1[0]);
            System.out.println(arr1[1]);
            System.out.println(arr1[2]);
        }

    }
    可以看到,动态初始化中我们制定了数组的长度是111,打印数组arr后是数据的内存地址,获取数组元素因为只指定了数组的长度,不具体指定里面的值,系统自动为我们分配了默认值;而静态初始化数组我们指定了数组的值,可以直接打印数组的值

    78dd58bfc083c5af42188cbc5848e2d8.png

    数组的遍历也是数组的常见操作之一,这里给大家举个栗子,一般情况下,我们如果不知道数组的长度,一般会用arr.length来获取,下面是一种通用的遍历方式,Java是强类型语音,变量定义要先声明类型,也可以获取数组的每个元素
    for(int i=0;i    System.out.println(arr1[i]);
    }

    今天就分享到这里,多多练习

    Java学习社区

    edfadb071c2ee8b0a49a44d288e27d36.png

    展开全文
  • 定义方式:vector<int> a; //二维vector<int>a[100] 在末尾压入容器:a.push_back(x);//二维 a[i].push_back(x) 在末尾弹出容器:a.pop_back(); ...其它像数组一样调用...
    • 定义方式:vector<int> a; //二维vector<int>a[100]

    • 在末尾压入容器:a.push_back(x);//二维 a[i].push_back(x)

    • 在末尾弹出容器:a.pop_back();

    • 清空容器:a.clear();

    • 查询元素个数:a.size();

    • 其它像数组一样调用就可以了。

    • 看做是一个动态数组

    转载于:https://www.cnblogs.com/ljy-endl/p/11271899.html

    展开全文
  • 1、Python的数组分三种类型:(1) list 普通的链表,初始化后可以通过特定方法动态增加元素。定义方式:arr = [元素](2) Tuple 固定的数组,一旦定义后,其元素个数是不能再改变的。定义方式:arr = (元素)(2) ...

    1、Python的数组分三种类型:

    (1) list 普通的链表,初始化后可以通过特定方法动态增加元素。

    定义方式:arr = [元素]

    (2) Tuple 固定的数组,一旦定义后,其元素个数是不能再改变的。

    定义方式:arr = (元素)

    (2) Dictionary 词典类型, 即是Hash数组。

    定义方式:arr = {元素k:v}

    2、下面具体说明这些数组的使用方法和技巧:

    (1) list 链表数组

    a、定义时初始化

    a = [1,2,[1,2,3]]

    b、定义时不初始化

    一维数组:

    arr = []

    多维数组:

    arr = [i for i in range(10), 1,[]] #注意, i for in xx 这个必须放在第一个位置,否则要先定义i,

    如:

    arr = [i for i in range(5), j for j in range(5), []]

    这是错误的

    i = 0

    j = 0

    arr = [i for i in range(5), j for j in range(5), []]

    这是正确的

    c、del 语句 和 : 的用法

    可以用 start : end 表示数组里的一个区间 ( i >= start and i < end)

    del 删除数组里的指定元素

    如: del arr[0]

    del arr[0, 2]

    newarr = arr[0, 2]

    d、遍历数组:

    for k, v in enumerate(arr):

    print k, v

    e、增加元素:

    一维

    arr.append('aaa')

    二维

    arr[0].append('aaa')

    如果要在任意位置插入用 arr.insert(n, 值)

    此外还有一种特殊的用法是:

    arr += [数组元素]

    在不指定下标的情况下,是允许用 += 增加数组元素的。

    (2) Tuple 固定数组

    Tuple 是不可变 list,一旦创建了一个 tuple 就不能以任何方式改变它。

    下面拿具体示例说明:

    >>> t = ("a", "b", "c", "d", "e") #[1] 用小括号包围来定义

    >>> t

    ('a', 'b', 'c', 'd', 'e')

    >>> t[0] #[2] 直接列出某下标的元素

    'a'

    >>> t[-1] #[3] 负数表示,从后面倒数的索引 -1 为倒数第一个, 0是顺数第一个

    'example'

    >>> t[1:3] #[4] 这里 1:3 是 i>=1 and i<3 的区间

    ('b', 'mpilgrim')

    Tuple 没有的方法:

    [1] 不能向 tuple 增加元素,没有 append 、 extend 、insert 等方法。

    [2] 不能从 tuple 删除元素,没有 remove 或 pop 方法。

    [3] 不能在 tuple 中查找元素,没有 index 方法(index是查找而不是索引,索引直接用下标即可,如:t[0])。

    使用 tuple 的好处:

    * Tuple 比 list 操作速度快。如果您定义了一个值的常量集, 并且唯一要用它做的是不断地遍历它, 请使用 tuple 代替 list。

    * 如果对不需要修改的数据进行 “写保护”, 可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句, 说明这一数据是常量。如果必须要改变这些值, 则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。

    * 还记得我说过 dictionary keys 可以是字符串, 整数和 “其它几种类型”吗? Tuples 就是这些类型之一。 Tuples 可以在 dictionary 中被用做 key, 但是 list 不行。实际上, 事情要比这更复杂。Dictionary key 必须是不可变的。Tuple 本身是不可改变的, 但是如果您有一个 list 的 tuple, 那就认为是可变的了, 用做 dictionary key 就是不安全的。只有字符串, 整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。

    Tuple 可以转换成 list, 反之亦然。

    转换方式为:

    t = list( t )

    反之:

    arr = tuple( arr )

    (2) Dictionary (哈希数组)词典数组

    #Dictionary 的用法比较简单,它可以存储任意值,并允许是不同类型的值,下面实例来说明:

    #下面例子中 a 是整数, b 是字符串, c 是数组,这个例子充分说明哈希数组的适用性。

    dict_arr = {'a': 100, 'b':'boy', 'c':['o', 'p', 'q']}

    #可以直接增加一个元素,如果同名,则会改变原来的key的元素的值

    dict_arr['d'] = 'dog'

    #输出所有的key

    print dict_arr.keys()

    #输出所有的value

    print dict_arr.values()

    #遍历数组

    import types

    for k in dict_arr:

    v = dict_arr.get(k)

    if type(v) is types.ListType: #如果数据是list类型,继续遍历

    print k, '---'

    for kk, vv in enumerate(v):

    print kk, vv

    print '---'

    else:

    print dict_arr.get(k)

    展开全文
  • 展开全部有两种实现方法:可以e68a843231313335323631343130323136353331333337623534List数组来实现可以map来实现方法一:map来实现比如要创建一个1行、3列的数组,实现方法如下:public static void main...
  • c++ 动态数组

    2015-06-02 08:18:59
    这学期学C++ ,晚上有道编程题, 比较坑, 感觉要用动态数组做, 但实际就是要静态数组, 因为动态的反而更难了。  用动态数组的时候,发现自己只会创建一维的 int *a = new int[5] ; 然后二维数组怎么创都...
  • 我们可以通过递归、静态数组、动态数组或vector容器来生成斐波那契数列,也可以直接使用STL的算法加一个简单的表示斐波那契数列三个元素之间相互关系的函数来生成:#include #include #include using namespace std;...
  • 为什么我们要介绍动态数组,它有什么?因为我们在写VBA程序的时候要存储的数据是多少,我们一般不能提前知道,所以很难定义数组的大小,如果定义小了存储不了数据,定义大了容易消耗内存。 动态数组的声明方式:...
  • 动态数组实现

    2015-05-10 10:27:32
    源码中ArrayList,Vector就是用数组实现的,且是可变数组,看看是怎么实现的。 默认大小10个。 public ArrayList() { this(10); }添加元素时 public boolean add(E e) { ensureCapacityInternal(size + 1); /...
  • 先来个简单的样例 int a[] = {1,2,3}; int arr_len = 0;...arr_len = sizeof(a)/sizeof(int);...解释:sizeof() keyword是求出对象所占用的内存...一个整数在32位系统上占用4个字节,不同的系统数值可能不同, siz...
  • C++动态数组的作用

    2020-01-27 17:49:26
    假如要创建一个数组数组长度由用户输入 ...但是,如果静态数组实现这个功能请问怎么实现? int bufferSize; cin>>bufferSize; int arr[bufferSize];吗?系统编译不过的 静态数组是在堆栈上分配...
  • JAVA中已经有一个封装好的可以直接使用的API——ArrayList,就是一种动态数组,但是下面我们要自己数组实现一个动态数组,直接满足我们的需求。 一.在实现之前,先给大家做些准备工作 1.要怎么实现动态数...
  • “数组,真的不知道要怎么样才能学会……真的很难,还有什么三键录入,麻烦!” 这应该经常是新手抱怨的了,同时经常...这对新手获说是一件好事,下面小编就来好好聊聊这场有意义的革新动态数组的出现,三键或成历...
  • 动态数组的长度可以在函数运行的过程中动态的扩充和缩小,怎么扩充和缩小?realloc函数。realloc函数也是系统提供函数,他是英文单词realloc的缩写,即“重新分配”的分配的意思。该函数的原型: #include<...
  • 数组数组的概念:是一种容器,可以同时存放多个数据值数组的特点:数组是一种引用...静态初始化(指定类容)动态初始化数组的格式:数据类型[] 数组名称= new 数组类型[数组长度];解析含义:左侧数据类型:也就是数组...
  • 首先,给出答案。你要的是 List<> 而不是 ArrayList<>是动态的。...底部的动态怎么搞的呢?其实很简单,就是当数组满了,那么我生成一个1.5倍的Array,然后把原先Array的内容拷贝进1.5倍...
  • 想问下动态数组的问题,要两个有序的数组合成一个,一次性完成。 #include stidio.h int main() { int *a;//是不是这里指针,等下就可以realloc了。 int *b; int i=0,j=0,k; printf ("请输入第一个数组:\n")...
  • 怎么用c语言定义一个不知道维数的二维数组,比如定义一个字符数组,存放几段(段数未知)不同长度(长度未知)的字符串
  • 通过串口接收数据,接收的是以十六进制的,怎么将接收到的数据转换成以双精度格式显示? 我连接的计数器,返回的频率值。理想接收到的应该是9.999;999;999MHz 大概的思路是通过从内存中读取数据,然后提取数据...
  • 前台传入一个用户名数组 根据这个数组作为查询的条件 返回一个...我想到的方法是数组拼接成一个字符串("李世民,李渊,李小龙")in吗? 不过有的查询条件数据库并没有记录匹配!程序会报错没有这个列。这个怎么破?
  • 今天做一个题,我不知道怎么初始化数组的长度,由于我不知道初始化为多少,到最后我输出的时候,显而易见,会输出一些0如果你在java里面想用数组,但是你不知道数组的长度那么请你Set ArrayList 等等。。。。。。...
  • 我们知道 char *a=new char[10]; 可以创建一个长度为10的数组。当把定值10换为一个变量时,...但我们怎么动态创建一个多维数组呢?一定有人写出来这样的代码: //错误代码 char **a=new char[10][10]; 但是在VC...
  • 数组的大小随时可变,需要不断添加或者删除新的元素,C++该怎么实现呢?vector、list、数组哪个更好呢?
  • vector动态创建数组

    千次阅读 2015-03-24 15:12:04
    这几天在做蓝阳理工大的acm在线测试系统。...于是想到了vectory这个东西,应为他不用创建大小,可以直接使用,一个push_back就可以直接动态的往后面加了。好了,问题来了,怎么创建二维的呢? vectory
  • ``` $.ajax({url:"cscx.do", type:"post", dataType:"text", success: function(msg) { ... 后端传来一个字符串数组怎么创建option并把值写入 ();" > ```

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 522
精华内容 208
关键字:

动态数组怎么用