簡體   English   中英

`size_t`總是`vector <int> :: size_type`或任何其他容器類型的別名?

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

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