我回顧一個C++項目,看看有效以下內容:爲了避免簽名/未簽名的比較,此C是否有意義?
std::vector<SomeType> objects;
//then later
int size = (int)objects.size();
for(int i = 0; i < size; ++i) {
process(objects[i]);
}
這是我看到的。 std::vector::size()
返回size_t
,可能有些尺寸與int
的尺寸無關。即使sizeof(int) == sizeof(size_t)
int
已簽名且無法保存所有可能的值size_t
。所以上面的代碼只能處理一個很長的向量的較低部分,並且包含一個bug。正確的方法是將size_t
用於size
變量和循環索引。
這就是說我很好奇爲什麼作者可能會寫這個?
我唯一的猜測是,第一,他省略了(int)
演員和編譯器發出類似的Visual C++ C4018警告:
warning C4018: '<' : signed/unsigned mismatch
因此筆者雖然,爲了避免編譯器警告的最佳方式是簡單地將size_t
轉換爲int
,從而使編譯器閉嘴。
C劇情有沒有其他可能的理智原因?
Nitpick:'size()'返回實現定義的'vector :: size_type',不是必需的rily'size_t'。 – 2010-04-16 13:11:25
nitpick的Nitpick:默認分配器確實使用'size_t'作爲'size_type'。是的,你可以寫'vector :: size_type s = v.size();',但是當你改變'v'的分配器時,你仍然會使用錯誤的'size_type',並且需要找到並更改用法(但是,typedefs可以幫助)。 –
UncleBens
2010-04-16 14:12:42
只要你輸入你的矢量類型,使用YourVectorTypedef :: size_type應該總是給出正確的類型。 – 2010-04-16 14:40:24