簡體   English   中英

為什么我們有std :: string :: npos但沒有std :: vector :: npos?

[英]Why do we have std::string::npos but no std::vector::npos?

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

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

而我想知道為什么沒有更具表現力的方式:

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

它基本上歸結為一個相當簡單的事實: std::string包含搜索功能,這導致需要告訴調用者搜索失敗。 std::string::npos滿足該要求。

std::vector沒有自己的搜索功能,因此無需告訴調用者搜索失敗。 因此,它不需要等效的std::string::npos

標准算法確實包括搜索,因此他們需要能夠告訴呼叫者搜索失敗。 它們使用迭代器,而不是直接使用集合,因此它們使用一個特殊的迭代器(一個永遠不應被解除引用的迭代器)用於此目的。 碰巧的是, std::vector::end()返回一個適合此目的的迭代器,因此使用了 - 但這或多或少是偶然的。 沒有(例如) std::vector任何直接參與都可以完成。

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類型可以表示類型的值范圍,附加值表示“對象沒有值”。 boost庫提供了這樣的類型。

標准庫還提供可選類型作為實驗功能。 以下是我使用此類型創建的示例: http//ideone.com/4J0yfe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM