Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量模板类:擦除(迭代器开始、迭代器结束)_C++_Arrays_Templates_Vector_Iterator - Fatal编程技术网

C++ 向量模板类:擦除(迭代器开始、迭代器结束)

C++ 向量模板类:擦除(迭代器开始、迭代器结束),c++,arrays,templates,vector,iterator,C++,Arrays,Templates,Vector,Iterator,所以我试图实现一个向量模板类,并试图编写一个擦除函数。擦除函数使用两个迭代器,start和end。然后,它将从位置start到end擦除每个元素,包括start,但不包括end。在删除元素的范围之后,它移动元素,从而在数组的中间没有空元素(如果这不够清楚,我可以尝试解释得更好)。p> 类的私有成员数据是一个名为Size的整数,它存储数组中当前的元素数;一个名为Capacity的整数,它存储为数组分配的当前空间;一个名为Arr的数组。我对迭代器还不是很在行,有人能告诉我如何做得更好或者如何修复它吗

所以我试图实现一个向量模板类,并试图编写一个擦除函数。擦除函数使用两个迭代器,
start
end
。然后,它将从位置
start
end
擦除每个元素,包括
start
,但不包括
end
。在删除元素的范围之后,它移动元素,从而在数组的中间没有空元素(如果这不够清楚,我可以尝试解释得更好)。p> 类的私有成员数据是一个名为
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;      

}
模板
typename向量::迭代器向量::擦除(迭代器开始,迭代器结束)
{
迭代器x=开始;
对于(;x!=end;x++)
{
Arr[x].~T();
}
for(迭代器x=start;x<代码> > p>不能破坏向量中间的对象,然后分配给它们。只能指定给“活动”对象

您可以做的是(移动)将
[end iterator,vector::end())
中的成员分配到
start
和下面的元素上。然后销毁向量末尾多余的对象

下面是一个使用real
std::vector
接口和
const_迭代器
对已擦除范围执行操作的示例:

  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;
  }
有人能告诉我如何做得更好吗?使用
std::vector
。它已经起作用了。这是关于什么的?
Arr[x]。~T();
?还有,std::vector::erase()只需将要擦除的元素移动到向量的末尾,然后更改
大小
条目。实际上没有删除任何内容。呃,您是从STL实现中复制的吗?