2017-02-14 17 views
0

Так что я пытаюсь реализовать класс векторных шаблонов, и я пытаюсь написать функцию стирания. Функция стирания принимает два итератора, start и end. Затем он стирает каждый элемент с позиции start до end, включая start, но не end. После того, как он стирает диапазон элементов, он сдвигает оставшиеся элементы так, что в середине массива нет пустых элементов (я могу попытаться объяснить, если это недостаточно ясно).Vector Template Class: erase (iterator begin, iterator end)

Частные данные для членов класса представляет собой целое число называется Size, которая хранит текущее количество элементов в массиве, целое число называется Capacity, которая хранит текущее пространство, выделенное для массива и массив называется Arr. Я еще не доволен итераторами, может кто-нибудь объяснить мне, как я могу сделать это лучше или как это исправить?

template <typename T> 
typename Vector<T>::iterator Vector<T>::erase(iterator start, iterator end) 
{ 
    iterator x = start; 

    for(; x != end; x++) 
    { 
     Arr[x].~T(); 
    } 

    for(iterator x = start; x < theSize - (start - end); x++) 
    { 
     Arr[x] = Arr[x + (start - end)]; 
    } 

    Size -= end - start;  

} 
+0

* может кто-нибудь объяснить мне, как я могу сделать это лучше * - используйте 'зОго :: VECTOR'. Он работает уже. И что это? 'Arr [x]. ~ T();'? – PaulMcKenzie

+0

Кроме того, std :: vector :: erase() просто перемещает элементы для стирания до конца вектора и просто изменяет запись 'size'. Ничто фактически не удаляется. – PaulMcKenzie

ответ

0

Вы не можете уничтожить объекты в середине вектора, а затем назначить им. Вы можете назначать только «живые» объекты.

Что вы можете сделать, это (перемещение) назначить членов из [end-iterator, vector::end()) над start и следующим элементом. И затем уничтожить лишние объекты в конце вектора.

Вот пример использования реальных std::vector интерфейса с const_iterator для стертого диапазона:

iterator erase(const_iterator _First, const_iterator _Last) 
    { 
    const size_type _Offset = _First - cbegin(); 
    const size_type _LastOffset = _Last - cbegin(); 

    iterator _NewEnd = std::move(begin() + _LastOffset, end(), begin() + _Offset); 
    _DestroyData(_NewEnd, end()); 
    _SetSize(_NewEnd - begin()); 

    return begin() + _Offset; 
    } 
+0

erm, [подчеркивания с заглавными буквами] (http://stackoverflow.com/q/228783/819272)? Вы буквально скопировали это из реализации STL? – TemplateRex