簡體   English   中英

在C ++ 11中,來自priorC ++ 11的std :: vector :: begin()是否等同於std :: vector :: data()?

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

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