[英]Vector Template Class: erase(iterator begin, iterator end)
因此,我试图实现矢量模板类,并试图编写一个擦除函数。 擦除功能需要两个迭代器start
和end
。 然后,它将擦除位置从start
到end
每个元素,包括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.