[英]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.