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
暂时更新这么多,后续会有补充和完善。。。
上述知识为本人独自整理,如有错误,欢迎指正。