2016-08-14 34 views
0

我是C++的初學者,對這些語句有疑問。這些C++語句的含義是什麼typedef向量<double> :: size_type

vector<double> vec1; 
typedef vector<double>::size_type vec_size 
vec_size size = vec1.size() 

從問題, C++: "vector<int>::size_type variable" - what is the point of declaring in this way?,據我所知,size::type擁有最大的可能向量的大小。我很困惑什麼類型size::type - 它是一個函數,變量等?使用typedefvec_size相當於vector<double>::size_type。所以第三行變成

vector<double>::size_type size = vec1.size() 

這對我來說很混亂。什麼是型號變量size

如果有人用簡體中文進行評論,這將會非常有幫助。

+5

'size_type'是一個無符號整數類型。提供該typedef的全部意義在於,您不必知道實現使用的確切類型。這就是說,它很可能是'size_t'。 – Praetorian

+0

增加了Praetorian所說的Containers :: size_type。所有容器都有與size_t相關的size_type。它不只是矢量。它在處理算法和排序時很方便。看看有效的STL,相當不錯的書 – TimLayne

回答

1

這對我來說很混亂。什麼是型號變量size

你的問題本身就會回答:它是一個vector<double>::size_type類型的變量。考慮以下內容:

struct type_name 
{ 
    typedef int inner; 
}; 

什麼是type_name::inner?這是一個typedef存儲在類型type_name::有C++作用域語法;它用於引用在其他名稱中聲明的名稱。在這裏,我們在type_name類型中聲明inner。所以它的全名是type_name::inner

在所有其他方面,它與任何其他typedef沒有區別。

std::vector被定義爲在其中聲明的類型別名被稱爲size_type。究竟是什麼類型的別名?這不是標準中規定的。

什麼陳述的是這種類型的含義。它是一個無符號整數類型,它足夠大以便能夠索引儘可能最大的任何元素vectoratoperator[]取值爲size_type; sizecapacity取值爲size_type。事實上,任何以任何方式與其大小或索引元素相關的成員都需要size_type類型的值。

雖然賠率很好,但它會是typedefsize_t

3

的是真的在這裏兩個問題:

是什麼這樣

這是從脫落你的手讓你的手指聲明的地步。如果您需要一次又一次地參考此類型,則每次只鍵入vec_size,而不是拼寫出vector<double>::size_type更容易。每。和。每一個。時間。

使用typedef。你的手指會感謝你。特別是那個小指頭,不需要經常碰到鑰匙。

更不用說,它使得結果代碼更容易在眼睛上。

現在,至於第二個問題:

什麼是可變大小的類型?

答案是:你不知道,你不應該在意。你應該關心的唯一事情就是這種類型足以表示向量中元素的數量。這就是這種類型的定義。

它可能是unsigned intunsigned long或甚至unsigned long long。但別擔心。不管它是什麼,它都會足夠大,可以表達最大可能矢量的大小,甚至可以宣稱和使用最小的希望。這也意味着這種類型也是表示矢量中任何元素索引的正確類型。因此,如果您需要保存向量中某個特定元素的索引,或者通過它們的索引遍歷向量中的值,則這是正確的類型。由於它足夠大以表示矢量的大小,因此足以表示矢量中任何特定值的索引。

當然,對於大小預計相當有限的矢量,按照今天的標準,使用普通的int也是可行的。但是通過使用這種類型,你會吹噓所有的朋友:看,我對C++有很多瞭解。我知道如何正確使用這種類型。

0

vec_size的類型是std::vector<double>::size_type。對於某些無符號整型,這通常是typedef,但實際類型是實現定義的。

換句話說,它在編譯器及其交付的標準庫(和頭文件)之間有所不同。

它通常會是一個std::size_t(或與之相當的東西),但允許有所不同。 std::size_t的實際類型也是實現定義的 - 它可能是unsigned,unsigned long,unsigned long long,uint32_t,uint_64_t。它可能是別的東西(例如某些提供所需操作的類類型)。

如果你想使用一些「更簡單」的類型(例如,unsigned long)使用尺寸,那麼你可以。但是,你接受你選擇的類型不支持所有可能的向量大小的風險 - 這可能意味着程序中的錯誤難以追蹤。使用std::vector<double>::size_type可以保證與所有符合標準的編譯器和標準庫一起工作。

相關問題