2017-04-04 92 views
3

为什么我们要写v.erase(v.begin(), v.begin()+3)为什么begin()在std :: vector中需要擦除?

为什么不把它定义为erase(int, int)所以你可以写v.erase(0,2)和执行照顾begin() s?

+0

,因为整个工程STL迭代器,它是方便易,因为如果你想以后改变向量列出,你就不需要更改代码,如果你使用迭代,没有这样的运气与诠释。 –

回答

6

接口container.erase(iterator, iterator)更通用,适用于没有索引的容器,如std::list。如果您编写模板并且不确切知道代码要处理哪个容器,这是一个优势。

最初的设计目的是尽可能通用和迭代器比指标比较一般。设计师可能添加额外的指数型重载vector,但决定不。

+0

此外,迭代器可能来自''函数,并且_those_返回索引将非常紧缩。 –

1

在STL中,迭代器是提供对STL容器一般访问的唯一实体。

的阵列可以通过指针和索引来访问。迭代器是这些索引/指针的泛化。
链接列表可以通过移动指针来访问(a la ptr = ptr->next)。迭代器是对这些的泛化。
Trees和HashTable需要特殊的迭代器类,它封装迭代这些数据结构的逻辑。

正如你所看到的,迭代器是普通型,它允许你对数据结构做常见的操作(如重复,缺失等),不论其底层的实现。

这样,您可以重构代码以使用std::listcontainer.erase(it0, it1),但仍可以在不修改代码的情况下使用。

相关问题