August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
当我们将vector从“double的vector”类泛化至“T的vector”模板时,我们并没有考虑push_back()、resize()和reserve()的定义。现在,我们必须重新考虑它们的定义,因为在14.2.2和14.2.3节中,这些函数的定义基于一些假设,这些假设对double是成立的,但并不是对所有其他元素类型都成立:
·如果类型X没有默认值,我们应如何处理vector?
·当元素使用完毕时,我们如何确保它们被销毁了?
我们必须解决这些问题吗?我们可能会说,“不要用不具有默认值的类型创建vector”
“将vector用于具有析构函数的类型时,使用方式不要引起问题”。但对于一个以“通用”为目标的模板而言,上述限制对用户是很恼人的,并且会给人这样的印象:设计者并没有仔细思考过这个问题或是根本不关心用户。通常,这种猜疑是正确的,而标准库的设计者就未留下这些问题。为了构造与标准库相同的vector,我们必须解决这两个问题。
为了处理没有默认值的类型,我们可以设置一个用户选项,以便在我们需要一个“默认值”时能够指定使用什么值:
即除非用户指定了其他值,否则使用T()作为默认值。例如:
析构函数的问题要更难以解决。基本上,我们需要处理非常尴尬的情况:数据结构同时包含已初始化数据和未初始化数据。到目前为止,我们已经花了很长时间学习避免未初始化数据以及通常伴随它的编程错误。现在——作为vector的实现者——我们必须面对这一问题,从而令我们——在作为vector的用户时——不必在实际应用中处理这些问题。 ...