时间: 2018-07-09 文章来源: 洋蜜蜂
在CS编程中,我们经常使用到数组,因为数组是比较低级别的数据结果,不需要太难的语言,大多数同学都是错误滥用数据来进行编程,但是数据真的适用于任何情况吗?下面洋蜜蜂CS辅导Tutor给大家列举一些例子分析。
在时间和空间方面,数组只是用于访问内存中对象序列的最佳构造。然而,它也是一个非常低级别的数据结构,具有巨大的滥用和错误可能性,并且在所有情况下都有更好的替代方案。通过“更好”,我的意思是更容易编写,更容易阅读,更不容易出错,并且速度更快。
数组的两个基本问题是
l 数组不知道自己的大小
l 数组的名称在最轻微的挑衅时转换为指向其第一个元素的指针
考虑一些例子:
void f(int a [],int s)
{
//做一些事; a的大小是s
for(int i = 0; i <s; ++ i)a [i] = i;
}
int arr1 [20];
int arr2 [10];
void g()
{
F(arr1,20);
F(arr2,20);
}
第二个调用将遍历不属于arr2的内存。当然,程序员通常可以正确地调整大小,但这是额外的工作,并且经常有人犯错误。推荐使用标准库向量的更简单和更简洁的版本:
void f(vector <int>&v)
{
//用v做点什么
for(int i = 0; i <v.size(); ++ i)v [i] = i;
}
vector <int> v1(20);
vector <int> v2(10);
void g()
{
F(V1);
F(V2);
}
由于数组不知道它的大小,因此不能有数组赋值:
void f(int a [],int b [],int size)
{
a = b; //不是数组赋值
的memcpy(A,B,大小); // a = b
// ...
}
void g(vector <int>&a,vector <int>&b,int size)
{
a = b;
// ...
}
向量的另一个优点是memcpy()不会为具有复制构造函数的元素(如字符串)做正确的事情。更多CS课程辅导可以找留学府tutor。
void f(string a [],string b [],int size)
{
a = b; //不是数组赋值
的memcpy(A,B,大小); //a=b
// ...
}
void g(vector <string>&a,vector <string>&b,int size)
{
a = b;
// ...
}
数组在编译时确定的固定大小:
const int S = 10;
void f(int s)
{
int a1 [s]; //错误
int a2 [S]; // 好
//如果我想扩展a2,我将不得不改为数组
//使用malloc()在free store上分配并使用realloc()
// ...
}
对比:
const int S = 10;
void g(int s)
{
vector <int> v1(s); // 好
vector <int> v2(S); // 好
v2.resize(v2.size()* 2);
// ...
}
C99允许本地数组的可变数组边界,但这些VLA有其自身的问题。
数组名称“衰减”为指针的方式是它们在C和C ++中使用的基础。但是,数组衰减与继承的交互非常糟糕。考虑:
class Base {void fct(); / * ... * /};
class Derived:Base {/ * ... * /};
void f(Base * p,int sz)
{
for(int i = 0; i <sz; ++ i)p [i] .fct();
}
Base ab [20];
Derived ad[20];
void g()
{
f(ab,20);
f(ad,20); //灾难!
}
在最后一次调用中,Derived []被视为Base [],当sizeof(Derived)!= sizeof(Base)时,下标不再正常工作 - 在大多数情况下都是如此。如果我们使用向量代替,错误将在编译时捕获:
void f(vector <Base>&v)
{
for(int i = 0; i <v.size(); ++ i)v [i] .fct();
}
vector <Base> ab(20);
vector <Derived> ad(20);
void g()
{
f(ab);
f(ad); //错误:无法将向量<Derived>转换为向量<Base>
}
很多的C和C ++中的大量新手编程错误与(错误)使用数组有关。列举到这里相信大家都已经有个大致了解,有时候会有更好的替代方案来有效处理数据结构。
洋蜜蜂辅导机构争当海外留学的引导者,创新式辅导模式与海外名校师资,旨在为学生学有所成,提供各方位的服务,包括课程辅导,选课咨询,写作辅导等服务。
更多课程资讯,详情可点开洋蜜蜂官网即可获得更多,如果有CS课程辅导需求,可以咨询24小时在线客服微信:yuff996,洋蜜蜂助你度过学习难关。