数据结构与算法---数组和字符串

1.数组是数据结构中的基本模块之一。因为字符串是由字符数组形成的,所以二者是相似的。数组的很多属性和处理方法在字符串中也是适用的,所以本文将数组和字符串一起进行理解和总结。

2.在数据结构中,数组和字符串都属于比较基础的数据结构类型,他们都属于顺序存储结构。顺序存储结构即在内存空间中通过占位的形式,将相同数据类型的一系列数据元素存储到一块连续的内存空间中。

3.本人练习数据结构和算法都是刷leetcode上面的习题,上面有很多例题练习,都是能够将对应的知识点涵盖,并且进行实际操作练习的题目,很有实际意义。

 

一、数组

1.定义和初始化:
    int a0[5];
    int a1[5] = {1, 2, 3};    //其余的位置会被默认初始化为0
 2. 获取数组长度
    1)int size = sizeof(a1) / sizeof(*a1);    //适用于C语言
    2)C++的操作中,还有专门获取数组长度的函数:

     a1.size();    //返回的是数组的长度

size()函数其实在C++中适用于很多标准模版,例如vector,string,list等等。。。
    3)由于数组属于顺序存储结构,一个数组的数据元素都是连续存储的,所以在知道一个数组的首地址之后,就能够根据某个数据元素在该数组中的位置查找到该数据元素(即数组的索引),从而对其进行读写操作。

cout << "The first element is: " << a1[0] << endl;        //a1[0]即为索引0对应的元素,就是数组的第一个元素
   注:数组的索引是从0开始的,数组所能访问到的最大索引为数组的的长度(size())减一

多维数组:此处讲解二维数组,三维及三维以上的数组以此类推

二维数组可以当作矩阵来看,普通的一维数组其实就是二维数组的一行或者一列。二维数组使用行索引和列索引来访问和遍历数组的每个元素。

 eg:int example[3][6];
第一行第一列的元素为example[0][0],第三行第六列元素为 example[2][5],(注:下标是从0开始的)

在内存空间中,一维数组是顺序存储结构,相当于数组按照索引顺序在内存地址中依次排列;对于二维数组来说,其存储方式也是顺序存储结构,将二维数组拆分成多行,每一行都是顺序排列,即先存储第一行,再存储第二行,接着存储第三行。。。以此类推,直至存储完所有的二维数组。

1.初始化二维数组:

多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。

int a[4][5];        //定义二维数组,4行5列,默认全部元素初始化为0

int a[3][4] = { {0, 1, 2, 3} , {4, 5, 6, 7} ,{8, 9, 10, 11}};      //使用{}逐行初始化每个{}里面都是二维数组的一行。

2.访问二维数组:

访问二维数组的方法跟一维数组一样,都是根据索引进行访问,数组的名字即为数组的首地址,也是数组第一个元素的地址。

需要注意的是,二维数组需要两个索引才能访问到具体的元素(即同时需要行索引和列索引)。

 eg:int example[3][6];
第一行第一列的元素为example[0][0],第三行第六列元素为 example[2][5],(注:下标是从0开始的)

 

二、动态数组

动态数组即为数组的长度并不是固定的,会根据存储的数据元素而改变的,动态数组的最好的体现是C++中的vector,他跟普通的数组类似,而且他还有可变长度的优点。

1)初始化:
    vector<int> v0;       //定义一个动态数组,不设定长度
    vector<int> v1(5, 0);   //设定长度为5,全部初始化为0
    vector<int> v2(v1.begin(), v1.end());          //使用迭代器复制V1的元素初始化V2的元素
    vector<int> v3(v2);              //直接复制V2的元素到V3
    int a[5] = {0, 1, 2, 3, 4};              
    vector<int> v4(a, *(&a + 1));  //根据数组的地址来初始化动态数组
   2)获取动态数组长度(跟普通数组类似)
    V1.size()

   3)使用迭代器遍历和访问动态数组:

vector<int>::iterator iter = ivec.begin();

迭代器的使用以后更新,此处只做简单的概述:其实迭代器就类似与指针,可以获取数组的第一个元素和最后一个元素的迭代器,然后可以对这两个迭代器进行前后移动,进而逐个访问数组的所有元素。

 

三、字符串

字符串的操作跟数组的操作是类似的,此处就不再赘述:
字符串同样可以进行定义和初始化操作,具体的实现跟数组的是一样的。因为字符串也是顺序存储结构,我们可以把他理解成是数据元素全部为字符类型的数组(字符数组),在C++里面,有专门的字符串数据类型(string,要包含头文件#include<string>)。

1),定义和初始化:

    string s1 = "Hello World";      //定义和显示初始化
    string s2 = s1;                         //复制初始化
    string s3(s1);                          //括号复制初始化
  2)字符串的比较:

直接进行比较:
     (s1 == "Hello World")
    (s1 == s2) 
    (s1 == s3)

使用compare函数进行比较:
    s1.compare("Hello World") 
    s1.compare(s2) 
    s1.compare(s3) 

3)字符串同样可以使用迭代器进行访问,其使用方法跟数组是一样的,不再赘述。。。

4)字符串的长度也是可变的,而且可以使用加减运算符对字符串进行增减:

eg:

  string s1="hello ";

  string s2="world";

  string s3=s2+s1;       //s3=“hello world”

5)字符串还有专门的查找函数:

find()和rfind()

可以返回需要查找的字符在字符串中的索引

eg:

        int ret=s3.find('o');         //ret=4

暂时更新这么多,后续会有补充和完善。。。

上述知识为本人独自整理,如有错误,欢迎指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值