【问题标题】:What is std::vector::front() used for?std::vector::front() 用于什么?
【发布时间】:2010-01-21 17:22:36
【问题描述】:

对不起,如果以前有人问过这个问题,但我想知道std::vector::front() 的用途是什么。

是否有理由使用例如myvector.front() 而不是 myvector[0]myvector.at(0)?

【问题讨论】:

  • 更有趣...为什么已经有begin()的时候还有front()?
  • @Inverse: 因为容器适配器std::queuestd::stackfront() 但没有begin()
  • 要与back() 保持一致,myvector[myvector.size() - 1] 并不是那么简单。

标签: c++ stl vector


【解决方案1】:

一些也适用于列表的通用算法使用它。

这是一个一般原则的示例:如果您为您支持的所有语义提供访问器,而不仅仅是您支持的实现,那么通用编写会更容易因此更容易重用代码。

【讨论】:

  • 啊,所以更多的是与其他容器类的一致性。只是出于好奇:vector::front() 是否等同于 [0] 或 at(0)?我的意思是,如果向量为空会发生什么?
  • @Tim:好问题。维基百科说未定义的行为:en.wikipedia.org/wiki/Vector_(C%2B%2B)fredosaurus.com/notes-cpp/stl-containers/… 表示与 [0] 相同,如果向量为空,我想这也是未定义的。
  • 看来我的问题现在已经完全回答了。感谢大家的帮助!
  • at(0) 如果向量为空,则抛出异常。
【解决方案2】:

如果 myvector 的类型更改为另一种不可索引的数据类型,例如列表,则无需更改访问容器前端的代码。

【讨论】:

  • 你和之前发帖者的答案应该结合起来。抽象的概念+具体的例子。
【解决方案3】:

这样做提供了一种称为静态多态性的东西。

假设我使用队列类编写了一个算法。它有一个 front() 函数来获取队列的下一个元素,还有一个 enqueue() 函数来添加到队列的末尾。现在假设我发现这个队列类写得不好而且非常慢,我宁愿使用更快的 std::vector(我知道有一个 std::queue,这只是一个例子)。如果获取 std::vector 的第一个元素的唯一方法是使用 v[0],我将不得不检查我的代码并将我对 front() 的所有调用替换为 [0]。但是通过实现front(),std::vector 现在可以替代我的队列类。我必须更改的唯一代码是算法中容器的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2020-02-01
    • 2017-11-10
    • 2015-12-14
    • 2021-06-02
    相关资源
    最近更新 更多