为什么我们要写v.erase(v.begin(), v.begin()+3)
?为什么begin()在std :: vector中需要擦除?
为什么不把它定义为erase(int, int)
所以你可以写v.erase(0,2)
和执行照顾begin()
s?
为什么我们要写v.erase(v.begin(), v.begin()+3)
?为什么begin()在std :: vector中需要擦除?
为什么不把它定义为erase(int, int)
所以你可以写v.erase(0,2)
和执行照顾begin()
s?
接口container.erase(iterator, iterator)
更通用,适用于没有索引的容器,如std::list
。如果您编写模板并且不确切知道代码要处理哪个容器,这是一个优势。
最初的设计目的是尽可能通用和迭代器比指标比较一般。设计师可能添加额外的指数型重载vector
,但决定不。
此外,迭代器可能来自'
在STL中,迭代器是提供对STL容器一般访问的唯一实体。
的阵列可以通过指针和索引来访问。迭代器是这些索引/指针的泛化。
链接列表可以通过移动指针来访问(a la ptr = ptr->next
)。迭代器是对这些的泛化。
Trees和HashTable需要特殊的迭代器类,它封装迭代这些数据结构的逻辑。
正如你所看到的,迭代器是普通型,它允许你对数据结构做常见的操作(如重复,缺失等),不论其底层的实现。
这样,您可以重构代码以使用std::list
和container.erase(it0, it1)
,但仍可以在不修改代码的情况下使用。
,因为整个工程STL迭代器,它是方便易,因为如果你想以后改变向量列出,你就不需要更改代码,如果你使用迭代,没有这样的运气与诠释。 –