【问题标题】:Why do we have std::string::npos but no std::vector::npos?为什么我们有 std::string::npos 但没有 std::vector::npos?
【发布时间】:2016-05-28 07:57:50
【问题描述】:

我想用 -1 表示尚未计算的大小:

std::vector<std::size_t> sizes(nResults, -1);

我想知道为什么没有更具表现力的方式:

std::vector<std::size_t> sizes(nResults, std::vector<std::size_t>::npos);

【问题讨论】:

  • std::string 很奇怪。它的成员太多,太奇怪了。真正的问题是为什么字符串不像向量。 (答案可能是 C。)
  • vector 没有find
  • npos 几乎可以替代.end() 作为索引而不是迭代器。 std::vector 没有基于索引的函数,因此存在结束/无效索引是没有意义的。
  • 至于更表达的方式为什么不std::numeric_limits&lt;std::size_t&gt;::max()或者如果你真的想全力以赴std::numeric_limits&lt;std::vector&lt;whatever_type&gt;::size_type&gt;::max()
  • @chris - 是的,std::string 早于添加 STL。 Uwe Steinmüller 和我设计了最初的版本(包括npos),之后很多人都踩到了。

标签: c++ containers c++-standard-library


【解决方案1】:

它基本上归结为一个相当简单的事实:std::string 包括搜索功能,这导致需要告诉调用者搜索失败。 std::string::npos 满足该要求。

std::vector 本身没有任何搜索功能,因此它不需要告诉调用者搜索失败。因此,它不需要 std::string::npos 的等价物。

标准算法确实包括搜索,因此它们确实需要能够告诉调用者搜索失败。他们使用迭代器,而不是直接使用集合,因此他们为此目的使用了一个特殊的迭代器(一个永远不应该被取消引用的迭代器)。碰巧,std::vector::end() 返回了一个适合该目的的迭代器,所以它被使用了——但这或多或少是偶然的。这将在没有(例如)std::vector 的任何直接参与的情况下完成。

【讨论】:

    【解决方案2】:

    来自cppreference

    std::size_t 是 sizeof 结果的无符号整数类型 运算符以及 sizeof 运算符和 alignof 运算符 (C++11 起)....

    ...std::size_t 可以存储的最大尺寸 理论上可能的任何类型的对象...

    size_t 是无符号的,不能代表-1。实际上,如果您尝试将大小设置为 -1,您实际上会将它们设置为由 size_t 表示的最大值。

    因此,您不应该使用size_t 来表示除了表示未计算大小的值之外还包括类型的可能大小的值,因为可能大小集合之外的任何值都不能用size_t.

    您应该使用能够表达您希望表示的所有可能值的不同类型。这是一种可能性:

    struct possibly_computed_size_type
    {
        size_t size;
        bool is_computed;
    };
    

    当然,您可能想要一个比这更有表现力的解决方案,但关键是至少possibly_computed_size_type 能够存储我们希望表达的所有可能值。

    一种可能性是使用optional 类型。一个optional 类型可以表示一个类型的值的范围,还有一个附加值表示“对象没有值”。 The boost library provides such a type.

    标准库还提供了一个可选类型作为实验特性。这是我使用这种类型创建的示例: http://ideone.com/4J0yfe

    【讨论】:

    • -1。请注意,std::string::npos 被定义为((std::size_t)(-1)),因此存在现有技术。与其将单个值指定为完全合理的“特殊值”,不如建议浪费额外的字节!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2011-07-03
    • 2020-02-01
    • 2014-10-24
    相关资源
    最近更新 更多