通常C的陣列都會要求像是
由於std::vector保證元素的記憶體區塊是連續的,因此你可以用:
int *
之類的prototype,如果從C++的std::vector<int>要傳給那樣的函式,要怎麼辦呢?由於std::vector保證元素的記憶體區塊是連續的,因此你可以用:
&(*v.begin())
&v[0]
&(v.front())
不過這不代表你可以用這種方式來取代原本的
為什麼不直接用
我個人會比較喜歡
operator []
,因為你會失去安全性。為什麼不直接用
v.begin()
?因為它回傳的是iterator,std::vector<T>的實作並不保證它的iterator一定等效於T*
,它只保證iterator一定可以Random Access,而T*
只是其中一種實作法。我個人會比較喜歡
&v[0]
,因為還滿直覺,也符合C的風格。
其實我以前就知道std::vector是連續儲存,可是直到別人講起之前我都沒想到可以這樣做= =
果然知道和理解是有差異的。
果然知道和理解是有差異的。
趕快換 Java 吧
回覆刪除所有東西都幫你寫好了
只是東西多到都不知道怎麼用 XDDD
不過所有我碰過的物件導向程式語言裡
回覆刪除最討厭的就是Java....囧
有空再來寫一篇我的偏見XD
寫完記得跟我說 ^++++++^
回覆刪除> 3. &(*v.front())
回覆刪除v.front() 傳回的是 reference, 不是 iterator. 如果 T 沒有 operator* 或 T 不是 pointer type, *v.front() 將導致 compile error. 我猜這只是你的一時糊塗. :P
> 不過這不代表你可以用這種方式來取代原本的operator [],因為你會失去安全性。
沒看懂這句.
ps. 我也對 Java 有偏見...
感謝,己更正!
回覆刪除其實我的意思是
避免去操作指向內部的指標
比方說vector::at就會在out of range時throw一個異常出來(我知道有些大老討厭exceptions)
而operator []....它也可能有某些封裝起來的行為,或是跟vector::at一樣會拋出異常
恣意操作這些指標很容易出事
而這不是這個手法的本意
vector 的 operator[] 可說是 unchecked 版本的 vector::at, 也就是說沒有 out of bound error detection.
回覆刪除除非是類似 VC 的 debug iterator 等的非標準 debug facility.
呃,好吧,從另一個角度來看好了
回覆刪除在vector上實行array取值
代表你要先拿到一個指標:
std::vector<int> v;
int * ip = &v[0];
先不考慮v在施行resize或reserve之後其空間基點會不會改變(會的話ip就跟iterator一樣腐敗發臭了)
甚至可以很愉快地施行
delete [] ip;
其實如果vector跟string一樣有提供data()就好了....