Упрощение метод изменения размера


Я делаю простой класс-контейнер для развлечения и образования, но мое восстановление/метод изменения размера, кажется, довольно неэффективно. Есть ли более простой способ сделать это?

// If FromFront is true, cells should be added or
// subtracted from the front of the array rather than the back.
void Rebuild(std::size_t NewSize, bool FromFront = false)
{
    const std::size_t OldSize = Size;
    Size = NewSize; // Size is used in other methods.

    Datatype* TemporaryStorage = new Datatype[OldSize]; // Allocate space for the values to be preserved while a new main array is made.

    for (std::size_t Index = 0; Index < OldSize; Index++) TemporaryStorage[Index] = BasePointer[Index]; // Copy values over to the temporary array.

    delete[] BasePointer; // Delete the main array...
    BasePointer = new Datatype[NewSize]; // ...And rebuild it with the appropriate size.

    for (std::size_t Iteration = 0; (Iteration < OldSize) && (Iteration < NewSize); Iteration++)
    {
        std::size_t BasePointerIndex = Iteration;
        std::size_t TemporaryStorageIndex = Iteration;

        if (FromFront) // We need to take special measures to give the indices offsets.
        {
            if (NewSize > OldSize) BasePointerIndex += (NewSize - OldSize);
            else TemporaryStorageIndex += (OldSize - NewSize);
        }

        BasePointer[BasePointerIndex] = TemporaryStorage[TemporaryStorageIndex]; // Copy values from the temporary array to the new main array.
    }

    delete[] TemporaryStorage; // Finally, delete the temporary storage array.
}


285
8
задан 11 марта 2011 в 06:03 Источник Поделиться
Комментарии
1 ответ

void Rebuild(std::size_t NewSize, bool FromFront = false)
{
const std::size_t OldSize = Size;

Datatype* NewStorage = new Datatype[NewSize];

А затем создать временный массив и копирует существующие данные в ней, просто создать новый массив и скопировать в эту.

    int CopyLength = std::min(OldSize, NewSize);

Мы начнем с определения того, сколько элементов на самом деле мы будем копировать

    if( FromFront )
{
std::copy(BasePointer + OldSize - CopyLength, BasePointer + OldSize,
NewStorage + NewSize - CopyLength);
}
else
{
std::copy(BasePointer, BasePointer + CopyLength, NewStorage);
}

Я использую std::copy, чтобы избежать необходимости писать копирование для петли себя.

    delete[] BasePointer; // Delete the main array...
BasePointer = NewStorage;
Size = NewSize; // Size is used in other methods.

удалить текущего массива и заменить его с моим новым массивом

}

9
ответ дан 11 марта 2011 в 07:03 Источник Поделиться