【问题标题】:Is begin() == end() for any empty() vector?begin() == end() 是否适用于任何 empty() 向量?
【发布时间】:2013-07-21 16:43:48
【问题描述】:

我一直认为对于任何空的std::vector VV.begin() == V.end()。然而,我在 C++ 规范中没有看到任何声明这始终是正确的。它一定是正确的,还是在大多数实现中恰好是正确的?

【问题讨论】:

  • 我很确定有人问过这个问题,但我很难找到它,而且我很确定它们是平等的。
  • 如果它不是真的,它将使所有用于迭代向量的常见模式无效...... ;)
  • 相关问题:如果begin()end() 都先转换为指针,那么等式是否仍然成立?我担心连演员表都没有定义?

标签: c++ stdvector


【解决方案1】:

是的,对于任何容器,empty() 的标准都是这样要求的。

C++11 标准的第 23.2.1 节表 96 说:

 +----------+---------------+----------------------+
 |Expression|  Return Type  | Operational Semantics|
 |----------|---------------|----------------------|
 |a.empty() |Convertible    |a.begin() == a.end()  |
 |          |to bool        |                      |
 |          |               |                      |
 +-------------------------------------------------+

【讨论】:

    【解决方案2】:

    23.2.1 一般容器要求,特别是表 96 容器要求

    a.empty() 可转换为bool,操作语义a.begin() == a.end()

    然后

    6 begin() 返回一个引用容器中第一个元素的迭代器。 end() 返回一个迭代器 是容器的结束值。 如果容器是空的,那么begin() == end();

    (强调我的)

    【讨论】:

      【解决方案3】:

      http://www.cplusplus.com/reference/vector/vector/end/

      如果容器为空,end() 与 begin() 相同。

      【讨论】:

      • 比 cplusplus.com 更可靠的资源:@​​987654322@.
      【解决方案4】:

      是的,这是真的。这是proof。当然,std::distance(a.begin(), a.end()) == 0 是一个空向量。

      【讨论】:

      • Proof 将是标准引用,而不是参考站点。
      猜你喜欢
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      相关资源
      最近更新 更多