矢量模板类:擦除(迭代器开始,迭代器结束)

时间:2017-02-14 18:07:54

标签: c++ arrays templates vector iterator

所以我试图实现一个矢量模板类,我正在尝试编写一个擦除函数。 erase函数有两个迭代器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;      

}

1 个答案:

答案 0 :(得分:0)

您不能销毁向量中间的对象,然后分配给它们。您只能分配到&#34; live&#34;对象。

您可以做的是(移动)从[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;
  }