【问题标题】:why is begin() needed in std::vector erase?为什么在 std::vector 擦除中需要 begin()?
【发布时间】:2017-04-04 10:23:05
【问题描述】:

为什么一定要写v.erase(v.begin(), v.begin()+3)

为什么不将其定义为erase(int, int),这样您就可以编写v.erase(0,2) 并且实现会处理begin()s?

【问题讨论】:

  • 因为整个 stl 都可以与迭代器一起使用,而且很方便,而且如果您以后想要将向量更改为列表,则无需更改代码,如果您使用迭代器,则 int 没有这样的运气.

标签: c++ vector iterator


【解决方案1】:

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

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

【讨论】:

  • 此外,迭代器可能来自<algorithm> 函数,并且具有那些返回索引将非常严格。
【解决方案2】:

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

可以通过指针和索引访问数组数据结构。迭代器是这些索引/指针的泛化。
链表可以通过移动指针访问(比如ptr = ptr->next)。迭代器是对这些的泛化。
树和哈希表需要特殊的迭代器类来封装这些数据结构的迭代逻辑。

如您所见,迭代器是一种通用类型,它允许您对数据结构执行常见操作(例如迭代、删除等),而不管它们的底层实现。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2015-04-16
    • 2011-07-17
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多