【问题标题】:Vector Template Class: erase(iterator begin, iterator end)矢量模板类:擦除(迭代器开始,迭代器结束)
【发布时间】:2017-02-14 18:07:53
【问题描述】:

所以我正在尝试实现一个矢量模板类,并且我正在尝试编写一个擦除函数。擦除函数需要两个迭代器,startend。然后它会擦除从位置startend 的每个元素,包括start,但不包括end。在它擦除元素范围后,它会将元素向左移动,以便数组中间没有空元素(如果不够清楚,我可以尝试更好地解释)。

类的私有成员数据是一个名为Size的整数,它存储数组中当前的元素个数,一个名为Capacity的整数,它存储为数组分配的当前空间,一个名为@的数组987654329@。我对迭代器还不是很了解,有人可以向我解释一下如何更好地做到这一点或如何解决它吗?

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;      

}

【问题讨论】:

  • 谁能给我解释一下如何才能做得更好 -- 使用std::vector。它已经工作了。这是关于什么的? Arr[x].~T(); ?
  • 另外,std::vector::erase() 只会将要擦除的元素移动到向量的末尾,并且只需更改 size 条目。实际上没有删除任何内容。

标签: c++ arrays templates vector iterator


【解决方案1】:

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

您可以做的是(移动)从[end-iterator, vector::end()) 分配成员到start 和以下元素。并且 then 销毁向量末尾的多余对象。

这是一个使用真正的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;
  }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多