August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
我们可以用几种不同的方法实现向量的赋值。例如,我们可以仅在涉及的两个向量具有相同数量的元素时才判定赋值是合法的。但是,在13.3.2节中,我们决定向量赋值应具有更为通用的可能也是最为明显的意义:当赋值v1=v2完成后,向量v1应该是向量v2的一个副本。例如:
显然,我们需要拷贝元素,那么空闲空间怎么处理呢?我们是否“拷贝”尾部的“空闲空间”?答案是否定的:新的vector将会获得元素的副本,但我们完全不了解新vector将被如何使用,因此我们无须为尾部的空闲空间操心:
最简单的实现包括如下操作:
·为副本分配存储空间。
·拷贝元素。
·释放原有已分配的空间。
·将sz、elem、space设置为新值。
如下所示:
作为惯例,赋值运算符将返回被赋值对象的引用。符号*this的含义参见12.10节。
上述实现是正确的,但通过观察我们可以发现上述实现包含了大量多余的存储空间分配和释放操作。如果被赋值vector的大小大于赋值对象会如何?如果被赋值vector的大小等于赋值对象会如何?在很多应用中,最后一种情况是十分常见的。在两种情况下,我们都只需将元素拷贝至目标vector中已就绪的新内存空间: ...