c++数组总结

数组的定义

如果有一堆数据需要处理,在程序中可能需要定义很多的变量,这样可以定义一个数组,相当于a1,a2…,an,这样就可以定义很多的数,进行同种类型数的处理,数组可以分为一维数组,二维数组,多维数组

一维数组:

可以想象成一个单坐标轴,不同的点是一个存储单元,你可以存储信息,可以是数或字符,可以进行大量的数据处理,免于定义的麻烦,其基本内容为:a[100] ,比如它,其中100意思是该数组含有100个数,分布a[0]–a[99】 因为含有第0项,因此不存在a[100],所以一般要根据题目进行增添,比如说题目要求小于100,则可以设a[110],这样可以保证数组正常使用,不会让数组越界,数组越界是一种常见难以发现的问题,因此在定义时需要额外小心

1、一维数组声明:值的类型(不能使引用)、数组名和元素数(用值大于1的常量表达式定义)

int& a[10];//错误,没有引用数组
int a[6] = { 0,1,2,3,4,5 };
int (&p)[6] = a;//p是数组a的引用123

2、数组元素初始化时,若没有显式提供元素初值,则元素会被像普通变量一样初始化:
1)函数体外定义的内置类型数组,元素初始化为0;
2)函数体内定义的内置类型数组,元素无初始化(若只初始化部分元素,其后的元素此时也会被初始化为0);
3)如果不是内置类型,则不管其在哪定义,自动调用其默认构造函数为其初始化,若该类无默认构造函数则会报错。

3、数组大小未知时,需要动态声明一维数组:

int* a = new int[2];
delete[]a;//数组使用完毕时要释放内存空间12

4、C风格字符串:末尾必须有一个字符’\0’
1)字符串常量,以双引号括起,编译器自动在末尾添加一个空字符
2)末尾添加了’\0’的字符数组

5、字符数组:既可以用一组由括号括起来、逗号隔开的字符常量进行初始化,也可以用一个常量字符串(末尾有空字符)进行初始化
注意:在使用处理C风格字符串的标准库函数时,牢记参数必须以结束符NULL结束;
二维数组:

二维数组可以想象成一个x,y坐标轴,将问题转换成二维数组更加容易解决,一般把二维数组的两个括号分成长和宽,这样可以让定义的数据更明确,其定义形式为:a[100][100] 其中包含了100*100=10000个数,同一维数组一样它是从(0,0)到(99,99)没有100为下标的二维数组,在定义二维数组时如果在主函数里面定义,它会被随机赋予初值,且定义的两个数不宜过大,防止因数目过大引起无法编译,或程序无法运行,如果定义在主函数的外面,则其初值会被定义为0,且可以定义成一个较大的数组。

6、C++规定,在声明和初始化一个二维数组时,如果对二维数组的所有元素都赋值,则第一维(行数)可以省略;

7、在C/C++中,二维数组按照行优先顺序连续存储,即先将第一行按顺序存储,再对第二行顺序存储;

8、一个二维数组元素a[x][y]在一维数组b中,是a[x][y]=b[x*列数+y];

9、二维数组的动态声明:
产生一个二维数组a[m][n]

int m = 5,n=3;
int *a = new int [m];
for (int i = 0; i < m; i++)
{
a[i] = new int [n];
}123456

只能用a[i][j]或者((a+i)+j)来访问数组的元素;
动态声明的数组,使用后需要释放内存:

for (i= 0; i < m; ++i)
{
delete []a[i];
}
delete []a;

多维数组:

在这里介绍一下三维数组,三维数组可以想象为立体,可以处理一些空间上的图像,基本的信息同上面相同,在主函数内不能定义过大的数,。

三维数组常见的用法

1.冒泡排序:

冒泡排序基本流程为:第一轮先是第一项与第二项,第二项和第三项…第n-1项与n比较,将大的一项排在后面的一项,这样就保证了最大一项可以到达最后,第二轮在挑出第二大的数,将其放在倒数第二位,这样一项项的将相对最大值挑出来,就完成了从小到大的排序,这种方法就是冒泡排序。

2.选择法排序:

其基本思想与冒泡排序相同,不过更为直接,它是直接将最小或最大的值挑出来放在最前面,这样完成从小到大或者是从大到小的排序

3.sort函数,sort函数是一个给数组排序的通用方法,其中sort函数要使用algorithm头文件,其基本形式为:

sort(a,a+5);即为a[0]–a[4]从小到大的排序,倘若要从大到小则方式为:sort(a,a+5,complare);

sort函数中的a是数组,5是结束时的下标。

四、㈠字符数组

⑴定义

字符串数组的定义与之前的数组相似,只是类型变为了char,其他规则都适用。

一维数组:char 函数名[行 常量表达式]

例如:char ch[5];

二维数组:char 函数名[列 常量表达式]

例如:char ch[2][12]

⑵初始化

初始化过程中,没有被初始化的数组项编译器会给默认赋值’\0’;

(整数数组没有被初始化的数组项被赋值为0)

例如:char c[5] = {‘a’,’b’,’c’,’d’}; 中 c[4] = ‘\0’; \0即空字符

char c[5]="abcd"字符串初始化数组的话,

字符串后会跟一个空字符,所以字符串的元素数量要少于定义的空间。

⑶赋值和引用

字符数组赋值时要注意,只能对元素赋值,

不能对整个数组赋值,如:

错误写法char c[5];c = {‘C’,‘h’,‘i’,‘n’,‘a’}; 正确写法char c[5];c[0]=‘C’;c[1]=‘h’;c[2]=‘i’;c[3]=‘n’;c[4]=‘a’;

字符型数组特殊的赋值方式,可以直接cin>>a,a为字符型数组

引用时相同,也不能把字符串数组整体引用了,只能引用逐个元素。

四、㈡字符串

一个字符串数组包含若干个字符串,每个字符串可以看做为一个元素,

同时不要求字符串元素具有相同的长度

字符串类型(string)

C++中对于strinig的定义为:typedef basic_string string;

也就是说C++中的string类是一个泛型类,由模板而实例化的一个标准类,本质上不是一个标准数据类型.

⑴字符串变量的定义

使用字符串变量使,首先在头文件加上:

#include ,否则会报错;

字符串变量的定义:string str1;可理解为相当于一个string类型赋值:string str2= “China”;输入输出:cin >> str1;

⑵字符串的引用

可以直接使用名称,例如string a;

可以直接使用a代指一整个字符串。

也可以使用string a[1]代指字符串a的第二个元素。

以一个题目为例

描述

给定N个单词(每个单词长度不超过100,单词字符串内仅包含小写字母)。

请求出N个单词中共有多少个不同的单词。

输入

第1行包含1个正整数N。

接下来N行每行包含一个字符串。

输出

一个整数,代表不同单词的个数

样例输入

5 lalala

hahaha

haha

lalala

haha

样例输出 3

提示

N <= 10000000

不同单词个数不超过100000

#include#include#include using namespace std;int main(){    vector a;    set  b;    string c;    int n;    cin>>n;    while(n–){    cin>>c;    a.push_back©;}    b.insert(a.begin(),a.end());    cout<<b.size()<<endl;   return 0;}

⑶字符串结束标志

如 char c[5] 数组,它的有效长度是5,但是求出的长度是6,

因为系统自动给字符串规定了结束标志’\0’,占据一个字符长度。

⑷字符数组的输入和输出

a. 逐个字符输入输出:

char c[20];cout << c[2];

b. 全部字符输入输出:

char c[20];cin >> c;cout << c;

⑸字符串变量的运算

a. 字符串复制直接使用赋值号即可:

如:string1 = string2;作用与strcpy一样

b. 字符串连接用加号:

string str1 = “C++”;

sring str2 = “Language”;

str1 = str1+str2;

输出的str1为"C++Language"

c. 字符串比较直接用==、>、<等即可

⑹字符串函数

a. 字符串链接函数strcat:

strcat(string1,string2)

将第2个字符串连接到第1个字符串后边

b. 字符串复制函数strcpy:

strcpy(string1,string2)

将第2个字符串复制到第1个字符串中,将第一个字符串覆盖,

若第二个字符串短,也会用其后自动补得0将第一个字符串覆盖,也就是将第一个字符串完全变为第二个。

c. 字符串比较函数strcmp:

strcmp(string1,string2)

如果str1>str2,结果为正数,等于为0,小于为负数

d. 字符串长度函数strlen:

strlen(str)

求字符串的有效长度,不包括’\0’

⑺字符串操作

strcpy(p, p1) 复制字符串strncpy(p, p1, n) 复制指定长度字符串strcat(p, p1) 附加字符串strncat(p, p1, n) 附加指定长度字符串strlen§ 取字符串长度strcmp(p, p1) 比较字符串strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串strchr(p, c) 在字符串中查找指定字符strrchr(p, c) 在字符串中反向查找strstr(p, p1) 查找字符串strlwr§将大写字母全部换为小写字母strupr§将小写字母全部换为大写字母

相对于字符型数组,字符串可以有以下操作

s.empty(); // s为空串 返回trues.size(); // 返回s中字符个数 类型应为:string::size_types[n]; // 从0开始相当于下标访问s1+s2; // 把s1和s2连接成新串 返回新串s1=s2; // 把s1替换为s2的副本v1==v2; // 比较,相等返回true!=, <, <=, >, >=

大小规则

1)数字0~9比字母要小。如"7"<“F”;

2)数字0比数字9要小,并按0到9顺序递增。如"3"<“8”

3)字母A比字母Z要小,并按A到Z顺序递增。如"A"<“Z”

4)同个字母的大写字母比小写字母要小。如"A"<“a”。

C++里还提供了两个函数给数组“整体”赋值。
(1) memset函数
memset函数是给数组“按字节”进行赋值,般用在 ehar型数组中,如果是int类型的数组,一般赋值为0和-1。使用前需要包含头文件:#include 。
例如,"memset(h 0.sizeof(h));"就是将h数组所有元素均赋值为0。清0月
,则第(2) fill 函数
fill函数是给数组“按元素”进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任问值。使用前需要包含头文件:#include 。例如,“ill(a,a+ 10,5);"就是将a数组的前10个元素赋值为5

在数组的题目中,通常会有一些要求对数据进行位置变动的,要分清楚数据的类型怎样更好的进行处理,以及一些简单变维的方法,在有些题目中要充分展现出来。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值