【问题标题】:When a string is "" or a vector has no elements, is `begin()` equal to `end()`?当字符串为 "" 或向量没有元素时,`begin()` 是否等于 `end()`?
【发布时间】:2013-05-13 23:51:06
【问题描述】:

std::string"" 或向量没有元素时,begin() 是否等于end()

如果有,begin()/end()的值是多少?

【问题讨论】:

  • 编译检查一下怎么样?关于你的第二个问题,你不在乎。

标签: c++ string iterator


【解决方案1】:

当 std::string 为 "" 或向量没有元素时, begin() 是否等于 end()?

是的,对于任何空的标准库容器,包括std::stringstd::vectorbegin() 将返回与end() 相同的迭代器。

如果有,begin()/end()的值是多少?

它将是该容器独有的迭代器,但不应取消引用。这样做会导致未定义的行为。

【讨论】:

  • 为什么是未定义而不是抛出异常?效率?
  • @Elazar,因为“按需付费”在 C++ 中很常见。
  • @Elezar 异常不适用于程序员的错误。
  • 谢谢,克里斯@Pubby(顺便说一句,它是“elazar”)。所以从概念上讲,它应该是一个assert,除了库被调整为发布模式,因此其中没有断言。我对吗?还是这里有其他问题?
  • @Elazar 也从来没有asserts。如果您正在迭代任何容器,则 您的代码 有责任检查您是否已到达 end() 迭代器。 C++ 不会检查所有迭代器取消引用以查看它们是否无效。假设您正在检查。
【解决方案2】:

是的。任何没有元素的 STL 容器类型都会有 begin() == end(),因为元素的范围是半开范围 [begin(), end())。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 2012-12-04
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2021-11-25
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多