向量模板类:擦除(迭代器开始,迭代器端)

Vector Template Class: erase(iterator begin, iterator end)

本文关键字:迭代器 开始 擦除 向量      更新时间:2023-10-16

,所以我正在尝试实现矢量模板类,并且正在尝试编写擦除函数。擦除功能需要两个迭代器startend。然后,它删除了从位置startend(包括start)的每个元素,但不删除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;      
}

您不能在向量中间销毁对象,然后分配给它们。您只能分配给" live"对象。

您能做的是(移动)在start和以下元素上分配[end-iterator, vector::end())的成员。然后然后在矢量末尾销毁了多余的OBJEC。

这是一个使用std::vectorconst_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;
  }