2017-07-18 195 views
0

當我在std::vector<Foo>(或每個具有隨機訪問迭代器的容器)上循環時,我使用無符號整數變量i。如果我想尊重規範,我應該使用std::size_t還是容器本身給出的類型:std::vector<Foo>::size_typestd :: size_t或std :: vector <Foo> :: size_type?

如果我選擇std::size_t(可讀性原因),我可以肯定的是,在std命名空間的每個容器的每一個實現使用std::size_tsize_type

注:我僅使用C++ 98(出於兼容性原因)。

+1

不,你不能確定。如果您想避免可能的縮小轉換,請使用容器提供的類型。 – StoryTeller

+0

一個有趣的事情是'size_t'可以是'unsigned long'的typedef,'std :: vector :: size_type'可以是64位Linux機器上的'unsigned long long'。兩者都是64位寬,並具有相同的範圍,但它們不是同一類型。 ([example](http://coliru.stacked-crooked.com/a/06c88c51b0cf219b)) – NathanOliver

+0

您可以使用一個模板類,根據是否使用「std :: size_t」和「 'std :: vector :: size_type''具有相同的大小(我現在不能嘗試實現它,但我確定它是可行的)。 – nefas

回答

3

這不是必然確實std::vector<Foo>::size_typestd::size_t相同。即使對於C++ 11也是如此。

但個人而言,我使用std::size_t作爲std::vector索引,而不考慮類型。

如果你感覺特別勤奮,你總是可以使用靜態斷言。顯然static_assert是後來添加超出了在C++ 98,但在這種標準,你可以使用類似

static char wrong_size_1[1 + sizeof(std::size_t) - sizeof(std::vector<Foo>::size_type)]; 

static char wrong_size_2[1 - sizeof(std::size_t) + sizeof(std::vector<Foo>::size_type)]; 

這將導致編譯時失敗,如果類型的類型是不一樣的尺寸。

+0

其實,我已經使用靜態斷言和boost。好主意 ! – Caduchon

+0

哇。 Boost仍然支持C++ 98!你知道,他們是好蛋。 – Bathsheba

+0

我對GCC 4.4.7使用boost 1.57,沒有任何(已知)問題。 ;-) – Caduchon

1

我可以肯定的是,在std名字空間的每個容器的每一個實現使用std::size_tsize_type

不,你不能。然而,在實踐中,可以相信,std::size_t爲載體或任何其他的容器足夠大基於單一陣列上因爲

size_t可以存儲任何類型(包括數組)的理論上可能的物體的最大尺寸。

+0

一個對象的最大尺寸可能不止是矢量的最大尺寸類型。當'T'是向量中的東西時,'std :: vector <> :: type'的範圍只有0到'numeric_limits :: max()/ sizeof(T)'。擔心的是我想說可能會縮小轉換範圍。 – StoryTeller

+0

@StoryTeller我擔心,如果你的整數太小,索引矢量的對象。 'std :: size_t'至少和它需要的一樣大,所以它可以表示任何索引。最糟糕的是它浪費了一點點的記憶。 – user2079303

+1

如果它太小,你將有無法達到的元素。如果它太大,你會「環繞」,並可能在錯誤的地方修改元素。我認爲一個比另一個更容易被捕獲。縮小轉換不僅僅是一件壞事。 – StoryTeller

相關問題