向量模板类:擦除(迭代器开始,迭代器端)
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;
}
您不能在向量中间销毁对象,然后分配给它们。您只能分配给" live"对象。
您能做的是(移动)在start
和以下元素上分配[end-iterator, vector::end())
的成员。然后然后在矢量末尾销毁了多余的OBJEC。
这是一个使用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;
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 列表的有效性在插入后开始迭代器
- 如何将迭代器(包括结束和开始之前的迭代器)测试到列表或forward_list保持有效
- 为什么 std::variant 使用开始和结束迭代器进行编译?
- Qi::p arse Boost Change开始迭代器
- 从两端开始浏览列表,然后使用迭代器在中间停止
- ->第一个/第二个到空映射迭代器开始
- 如何使用迭代器实现从序列的中间到开始的循环
- 向量模板类:擦除(迭代器开始,迭代器端)
- 如何创建从开始和结束迭代器的范围
- 字符串文本的C++宏开始迭代器和结束迭代器
- Vector::迭代器在与开始比较时崩溃
- map/set迭代器不可递增,我无法从头开始重新启动映射
- 开始,结束简单类的迭代器规范
- 如何返回提升multi_index迭代器的开始和结束
- 使用模板<类输入迭代器>字符串(输入迭代器开始,输入迭代器结束)时出现奇怪的错误;
- C++映射从迭代器位置开始搜索
- 减法或递减随机访问迭代器指向开始
- Vector:<int>:迭代器在设置时使用 begin 时从向量的末尾开始