[英]Is `size_t` always an alias for `vector<int>::size_type` or any other container type?
讓我們做最簡單的例子:
配方1:
std::vector<int> vec;
// add 10E11 elements
for(std::size_t n = 0; n < vec.size(); ++n)
// ...
配方2:
std::vector<int> vec;
// add 10E11 elements
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)
// ...
當然, unsigned int
或任何不適當的數據類型在這里都不起作用,我們必須編譯x64。 我的問題是:是否有任何情況下,第一個表述可能會導致問題,或者我們是否可以安全地總是用這么短的表示法寫出來? 如果它們很容易覆蓋(x86,任何其他容器, size_type
其他應用程序),我也會在類似的設置中感興趣。
std::vector
保證指針是整個序列的有效迭代器,因為vector::data
返回“指針使得[data(), data() + size())
是有效范圍。” 這是指針添加,它是在std::ptrdiff_t
,它是std::size_t
的簽名版本。
此外,[iterator.requirements.general] / 6適用:
...對於整數值
n
和可解引用的迭代器值a
和(a + n)
,*(a + n)
等效於*(addressof(*a) + n)
...
vector::size_type
可能比std::size_t
更窄 ,例如64位系統上的32位。 但這不是我擔心的事情。
雖然在所有常見實現中都是這種情況,但標准對此不作任何保證。 保證的是std::vector<T>::size_type
是一個實現定義的無符號整數類型。
參考文獻:
23.2.1一般容器要求[container.requirements.general]
X :: size_type [是]無符號整數類型
和23.3.6.1類模板向量概述[vector.overview]§2
typedef implementation-defined size_type; // see 23.2
雖然std::vector::size_type
通常是std::size_t
,但不能保證它必須。 它使用起來更安全
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.