剑指offer(二.2)数据结构之数组2 面试题3

来源:互联网 发布:沈阳华晨宝马知乎 编辑:程序博客网 时间:2024/05/17 01:09

2. 动态数组

C++要求定义数组时,必须明确给定数组大小,但很多情况下,预编译时并不能确定数组长度。为解决数组空间效率不高问题,设计实现了多种动态数组。
C++中,动态内存分配技术可以在程序运行中按实际需要申请适量内存,使用结束后还可以释放【申请和释放的内存单元是堆对象,new和delete】

1)使用运算符new创建动态数组

创建一维数组:new 类型名 [数组长度];    数组长度指出数组元素个数,可以是任何能得到正整数值的表达式。
 delete[] 指针名;
最好是将数组的建立和删除过程封装起来,形成一个动态数组类,便于使用。动态数组类中,通过类的成员函数访问数组元素,每次访问前检查下标是否越界
【<cassert>头文件的assert可以实现这种检查,注意,它仅在debug模式下生效。其功能:判断一条件表达式的值是否为True,若不为真,则程序终止,并报错】

动态申请的数组是没有名字的,需要用指针使用。

创建多维数组: new 类型名 T[数组第1维长度][数组第2维长度]……;
第1维长度可以是任何结果为正整数的表达式,其他各维数组长度必须是结果为正整数的常量表达式。
申请成功后,new返回一个指向新分配内存的首地址的指针,指向T类型数组的指针。
数组元素个数:除最左边一维外各维下标表达式的乘积。

2)STL中的vector类模板

new动态数组不能在使用过程中动态扩展空间,而vector作为向量容器,可以动态的扩展容器空间。
vector定义动态数组: vector<元素类型>数组对象名(数组长度表达式);

vector定义的数组对象的所有元素都会被初始化
若数组元素为基本数据类型,所有元素初始化为0;
若数组元素为类类型,调用类的默认构造函数初始化;【该种动态数组要保证作为数组元素的类具有默认构造函数】
初值可以指定,但只能为所有元素指定相同初值,形式:
vector<元素类型>数组对象名(数组长度,元素初值);

vector数组对象元素访问方式:数组对象名[下标表达式],数组对象名表示的是一个数组对象,而非数组首地址。
数组对象不是数组,而是封装了数组的对象。

int n=5;  vector<double>arr(n);  arr.size();----返回数组容器大小,实际有效的元素个数。

动态扩容实现:数组的空间不足时,vector对象自动用new分配一块更大区域,使用赋值运算符=将原有数据赋值到新的空间,并释放原有空间。为提高效率,vector数组每次扩充容量时,新容量都是前一次的两倍。
arr.capacity();---返回数组的容量,所能容纳的元素数目。
arr.reserve(n);---n是整型数据,若当前容量≥n,什么也不做;否则扩大arr容量,使arr容量不小于n.
使用动态数组要尽量减少改变数组容量大小的次数。【每次扩容需要大量额外操作】在向vector中插入大量数据前,粗略估计插入元素之后的向量元素的大小,在插入前使用reserve确保该部分空间被分配,避免多次重新分配空间。
插入新元素时,插入位置之后的元素都被顺序向后移动,插入操作效率并不高。要注意在不同位置上插入可能导致某些迭代器、指针和引用的失效。
删除向量中元素时,被删除元素后面的元素都会被向前移动,将被删去元素留下的空位补上。删除元素之后的迭代器、指针和引用会失效。删除元素时,并不会释放空闲空间,可用vector<T>(s.begin(),s.end()).swap(s);  【用s的内容创建临时的vector对象,将该容器与s交换,s原先占有的空间便属于临时对象,执行完该句后,临时对象被析构、释放】释放空闲空间。

面试题目3:二维数组中的查找

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

思路与分析:二维数组在内存中连续存放。内存中从上到下存储各行元素,同一行中则由左到右存储各元素。通过观察具有该特性的具体的二维数组,找到查找规律。可以选择从左下角或者右上角(以此为例)的数字开始进行查找,若等于要查找的数字,查找结束;若该数字大于要查找的数字,则剔除这个数字所在的列;若该数字小于要查找的数字,则剔除该数字所在行。不断缩小范围直至找到要查找的数字,或查找范围为空。
#include <iostream>  using namespace std;bool FindKey(int a[][4], int rows, int columns, int value){int row = 0;int column = columns - 1;while (row<rows&&column >= 0){if (a[row][column] == value){return true;}else if (a[row][column] > value){column--;}else{row++;}}return false;}int main(){int a[4][4] = { 1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15 };bool flag = FindKey(a, 4, 4, 7);if (flag){cout << "find" << endl;}elsecout << "not find" << endl;system("pause");return 0;}

其实代码可以写的更完善些的。。。敲打敲打
0 0
原创粉丝点击