[英]Is std::vector::begin() from priorC++11 equivalent to std::vector::data() in C++11?
先前的C++11
std::vector::begin()
是否等同於C++11
中的std::vector::data()
? 我問這個的原因,早於C ++ 11,我曾經把std :: vector :: begin()當作指針,但是在C ++ 11之后,它不是,我不能轉換為等效的指針。 那么,我可以在C ++ 11之后使用data()嗎?
不, begin
返回一個迭代器,而data
返回一個指針。 對於給定的實現,這些可能是相同的,但您不應指望這一點。
使用迭代器作為指針是完全錯誤的,因為它是實現定義的。 如果在迭代器中仍然需要指向數據的指針,則應該使用dereferenced iterator的地址,如下所示:
std::vector<int> v; v.push_back(42);
std::vector<int>::iterator it = v.begin();
int * p = &*it;
當然,在c ++ 11中,您可以使用.data()
作為向量元素的指針。
先前的C ++ 11中的std :: vector :: begin()是否等同於C ++ 11中的std :: vector :: data()?
取決於你的意思。 解除引用會產生對向量中第一項的引用,但是begin()返回的迭代器不能保證可以轉換為data()返回的指針類型。
我問這個的原因,早於C ++ 11,我曾經把std :: vector :: begin()當作指針,但是在C ++ 11之后,它不是,我不能轉換為等效的指針。
你的代碼運氣好(或壞),取決於你如何看待它。
那么,我可以在C ++ 11之后使用data()嗎?
有兩個迭代器對跨越了矢量的數據:
begin()
到end()
和
data()
到data() + size()
您可以使用任何標准算法,結果將是相同的。
作為一個好的風格你應該使用begin()
到end()
你可以(幾乎總是)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.