繁体   English   中英

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

[英]Vector Template Class: erase(iterator begin, iterator end)

因此,我试图实现矢量模板类,并试图编写一个擦除函数。 擦除功能需要两个迭代器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;      

}

您不能销毁矢量中间的对象,然后将其分配给它们。 您只能分配给“活动”对象。

您可以做的是在start元素和后续元素中从[end-iterator, vector::end())分配成员。 然后在向量的末尾销毁多余的对象。

这是一个使用带有const_iterator的实际std::vector接口作为擦除范围的示例:

  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;
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM