为什么在 std::vector erase 中需要使用 begin()?

5

为什么我们要编写 v.erase(v.begin(), v.begin()+3)

为什么它不被定义为 erase(int, int),这样你就可以编写 v.erase(0,2),然后实现会处理 begin()的问题呢?


因为整个 STL 都使用迭代器,这很方便,如果您以后想将 vector 更改为 list,则不需要更改代码,如果使用 int,则没有这样的运气。 - Andrew Kashpur
2个回答

7

接口container.erase(iterator, iterator)更一般化,适用于没有索引的容器,例如std::list。如果您编写模板且不知道代码将在哪个容器上运行,则这是一个优点。

最初的设计旨在尽可能普遍化,而迭代器比索引更通用。设计师们本可以为vector添加额外的基于索引的重载,但却决定不这样做。


此外,迭代器可能来自于 <algorithm> 函数,让它们返回索引将会非常受限制。 - Lightness Races in Orbit

1
在STL中,迭代器是唯一提供对STL容器进行通用访问的实体。
可以通过指针和索引访问数组数据结构。迭代器是这些索引/指针的泛化。
移动指针(a la ptr = ptr->next)可以访问链表。迭代器是这些指针的泛化。
树和哈希表需要特殊的迭代器类来封装迭代这些数据结构的逻辑。
正如你所看到的,迭代器是通用类型,允许您对数据结构执行常见操作(如迭代、删除等),而不管它们的底层实现。
这样,您可以重构代码以使用std::list,并且container.erase(it0, it1)仍然可以正常工作,而无需修改代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接