作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题低阶 array 与高阶 vector 的取舍 (Was: Re: [问题])
时间Wed Aug 10 15:14:17 2005
原po gr网友在这里问过三四次问题,全都没有善用标题,
不是写个「新手问题」,就是只有「[问题]」。
建议他以後要在标题中明确而扼要的点出问题的内容。
这是基本的网路礼仪,也是一种良好的思考训练。
由於以下所写,已经和原来的问题渐行渐远,所以我
另立一个标题。
※ 引述《gocpp (cpp)》之铭言:
: 看情况啦。array 还是必要的,否则早就丢掉的。
: 以我的经验来说,除非是写短短的测试程式,或有极端效能的要求,
: 一般是很少使用 array,更常用的是 vector。
: array 的确有很多不安全的地方,但我常使用 vector 的更重要理由
: 倒不是因为 array 不安全,而是我觉得它不太方便。
[中略]
: 当然,这些都是取巧的小手段,不值一哂。不过若以比较高阶的观点来
: 看,直接操作 array 还是相当低阶的动作,需要比较多的专注力,虽然
: 不能忽略这种精确的训练,但大多时候,我希望 C++ 的编程风格,除了
: 讲求 C 的精确和高效之外,也能像 Basic 一样「简单」。基於这个原
: 则,在 C++ 中我的确是倾向少用 array 的。如果写 C 的话,就只好乖
: 一点,有什麽就用什麽。
array 与 vector 的取舍,有一点重要考量,就是元素个数
是否会在程式执行过程中变来变去。会变的话,通常都应该
舍 array 而取 vector。 C 时代,透过 malloc()/realloc()
来操作动态 array 的烦琐而易出错的做法,到了标准的 C++
时代,就该用会自动帮我们搞定的 vector 来取代了。
至於若元素个数固定不变的话,若是想要赶快写出一个正确
而可用的 C++ 程式,也是可以用 vector。我写 ACM 题目的
浅薄经验,一开始常常用 vector 写,往往很快就可写出一
个被接受的程式。可是当我一看到执行所耗费的时间,和别
人的速度一比,马上 Orz... 於是又改用原始的 array 来做,
接着都会多花上许多时间来除错,最後才弄得出一个正确而
跑得比较快的程式来。直接操作 array 真的是太低阶而易出错。
这也是为什麽一些 C++ 大老会劝人:若是本来的目标就是 C++
的人,直接学 C++ 就对了,而不要先学 C,再来学 C++ 的部份
原因。而且也在 C++ 教学书很前面的地方,就开始适量的引进
C++ standard library 来让学习者使用,以避免低阶操作的种种
困扰。
: 在 C99 中,array 在初始化时,已经可以使用变量来初始它的规模,这使
: 得 array 的使用更加便利。
: 不过 C++ 并不支援这种功能,因为 C++ Standard 已经有 vector 等容器
: 了,可以不需要类似 C99 的 array。
就 C++ 来讲,当然有了强大的 vector,就不会想在核心语言层次
对 array 动手脚了。然而,就 C 的立场,新增这种执行时期才决
定元素个数的 array 很可能的确有必要。Stroustrup 曾感慨说,
「C 标准」的增修未能和 C++ 密切配合,导致 C99 和 C++ 更难
相容了。他甚至希望有朝一日,C 和 C++ 能够合一。我无知的想法
是觉得这个不太可能啦。C++ 真的太复杂,要宣称 Our compiler
is C++ standard-comformant 有多难呀!随便一个硬体平台,要
有个 C compiler,相形之下,容易得太多了。一旦 C 和 C++ 合一,
到时还不是又要搞个 C++ subset 出来,让一大堆 embedded system
来用。其实目前就有这种东西,只是很乱。C 和 C++ 合一,恐怕
会更乱吧 :-)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: khoguan 来自: 220.130.208.168 (08/10 15:24)