为什么我们有std :: string :: npos但没有std :: vector :: npos?

时间:2016-02-16 20:51:15

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

std::vector没有自己的搜索功能,因此无需告诉来电者搜索失败。因此,它不需要等效std::string::npos

标准算法确实包括搜索,因此他们需要能够告诉呼叫者搜索失败。它们使用迭代器,而不是直接使用集合,因此它们使用一个特殊的迭代器(一个永远不应被解除引用的迭代器)用于此目的。碰巧的是,std::vector::end()返回一个适合此目的的迭代器,以便使用 - 但这或多或少是偶然的。没有(例如)std::vector的任何直接参与都可以完成。

答案 1 :(得分:1)

来自cppreference

  

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

     

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

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类型可以表示类型的值范围,而附加值表示对象没有值&#39;。 The boost library provides such a type.

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