我在自定义动态数组类中有这个函数,允许用户在这个类中插入另一个数组。它有效,但我肯定99%肯定这不是最快的解决方案,我想知道是否有可能结合两个for
循环来提高性能?如果是这样,怎么样?我有点卡住了。
提前感谢。
void insertrange(T item[], int sizerange, int index)
{
int k = this->size;
int j = 0;
if(this->size + sizerange >= this->capacity) //if the size + added size are bigger than the capacity
{
this->enlarge(this->capacity + sizerange); //enlarge the array
}
for(k; k >= index; k--) //for every element from the end to the index where to add the new array
{
this->array[k + sizerange] = a[k]; //replace the element to his new spot
}
for(j; j < sizerange; j++) //vor every element in the new array
{
this->array[index + j] = item[j]; //place it in the new spot
}
size += sizerange;
}
答案 0 :(得分:2)
我看到的唯一可能的性能优势是每次数组变大时都会进行较少的动态分配。在大多数情况下,每次需要重新分配时,将容量乘以2会更好。
答案 1 :(得分:2)
我认为关键是你不必复制空单元格。
void insertrange(T item[], int sizerange, int index)
{
// This actually points past the end of the current array, right?
int onePastLastEntry = this->size;
// Still need to make sure the new array is large enough
if(this->size + sizerange >= this->capacity) //if the size + added size are bigger than the capacity
{
this->enlarge(this->capacity + sizerange); //enlarge the array
}
// you should be able to go forward instead of backwards
for(i = index; i < onePastLastEntry ; i++)
{
// move the current element
this->array[i + sizerange] = a[i];
// then copy the new value
this->array[i] = item[i - index];
}
你实际上可以从零开始循环,也可以转到onePastLastEntry - index
,但这会让数学很奇怪:
// you should be able to go forward instead of backwards
for(i = 0; i < onePastLastEntry - index; i++)
{
// now you have to add the index in two places here
this->array[i + index + sizerange] = a[i + index];
// and add the index in the copy as well
this->array[i + index] = item[i];
}
答案 2 :(得分:1)
你的k for循环中有一个额外的副本。 k索引应该从size-1开始,而不是从size开始,因此你要复制一个超出数组末尾的额外元素。但是,这将提供可忽略不计的加速。如果需要严格的性能改进,您应该考虑优化放大功能或使用与数组不同的数据结构。
答案 3 :(得分:0)
您可以移动元素,而不是复制它们:
for(k; k >= index; k--)
{
this->array[k + sizerange] = std::move(a[k]);
}
另一种可能的改进,特别是对于具有昂贵的默认构造函数的类,是使用移动构造函数构造T到位。当您分配而不是使用new T[]
分配哪个默认构造每个元素时,使用new char[]
或malloc
分配原始字节。然后你可以使用placement new来当场移动构造对象。