【发布时间】:2016-02-18 06:41:57
【问题描述】:
所以我必须在 C++ 中编写一个 operator= 方法,将一个数组的所有值复制到另一个数组中。这是我写的:
dynamic_array &dynamic_array::operator=(const dynamic_array &a) {
size = a.get_size();
if (size % BLOCK_SIZE == 0){ //a multiple of BLOCK_SIZE
allocated_size = size;
} else {
int full_blocks = size / BLOCK_SIZE;
allocated_size = (full_blocks+1) * BLOCK_SIZE;
}
try {
array = new int[allocated_size];
} catch (bad_alloc){
throw exception (MEMORY_EXCEPTION);
}
//copy a[i..size-1]
for (int i = 0; i < size; i++){
array[i] = a[i];
}
return *this; //returns a reference to the object
}
所以它不对大小做任何假设,而是设置给定数组的大小和分配的大小(并使用另一个 get_size() 方法)。现在我必须编写的第二个代码只是说我必须创建一个包含 a 中元素副本的数组。现在我只写了和我的 operator= 方法一样的东西(没有返回任何东西):
dynamic_array::dynamic_array(dynamic_array &a) {
size = a.get_size();
if (size % BLOCK_SIZE == 0){ //a multiple of BLOCK_SIZE
allocated_size = size;
} else {
int full_blocks = size / BLOCK_SIZE;
allocated_size = (full_blocks+1) * BLOCK_SIZE;
}
try {
array = new int[allocated_size];
} catch (bad_alloc){
throw exception (MEMORY_EXCEPTION);
}
//copy a[i..size-1]
for (int i = 0; i < size; i++){
array[i] = a[i];
}
}
现在这给了我想要的输出,但我只是想知道是否有更简单的方法来执行这两种方法。这些方法适用于动态数组,我觉得代码行数比需要的多。 operator= one 应该将 a 的元素复制到一个新的动态数组中,dynamic_array::dynamic_array(dynamic_array &a) { 应该创建一个包含 a 中元素副本的新数组。听起来每种方法的代码相同,因为您总是需要创建一个新数组,并且总是需要将数组元素从一个数组复制到另一个数组,但是有没有更简单的方法来编写这两种方法,或者这是最简单的怎么做?
【问题讨论】:
-
查找“复制和交换成语”stackoverflow.com/q/3279543/214671
-
抓
bad_alloc只扔exception是什么原因? -
@MatteoItalia 这是复制和交换在性能方面相当欠佳的情况
-
@M.M 效率低下,但问题中的代码相当于手工复制和交换!只有在决定分配之前查看现有数组和分配的大小,我才会认为它正在获得优势。
-
是的,如果这样做会更好