轉(zhuǎn)載自:http://nianning1981.blog.163.com/blog/static/3083014320103171299619/
感謝:http://topic.csdn.net/t/20050429/20/3976956.html
感謝:http://yzyanchao.blogbus.com/logs/47796444.html
不過(guò)那邊是轉(zhuǎn)載自《effective stl》。
std::vector很方便,但有時(shí)調(diào)用的函數(shù)的參數(shù)規(guī)定是數(shù)組,需要將vector轉(zhuǎn)為數(shù)組,另外開(kāi)辟一個(gè)空間,將vector一項(xiàng)項(xiàng)復(fù)制過(guò)去代價(jià)過(guò)大,可用下面的方法。
給定一個(gè)
vector<int> v;
表達(dá)式v[0]生產(chǎn)一個(gè)指向vector中第一個(gè)元素的引用,所以,&v[0]是指向那個(gè)首元素的指針。vector中的元素被C++標(biāo)準(zhǔn)限定為存儲(chǔ)在連續(xù)內(nèi)存中,就像是一個(gè)數(shù)組,所以,如果我們想要傳遞v給這樣的C風(fēng)格的API:
void doSomething(const int* pInts, size_t numInts);
我們可以這么做:
doSomething(&v[0], v.size());
也許吧??赡馨伞Nㄒ坏膯?wèn)題就是,如果v是空的。如果這樣的話,v.size()是0,而&v[0]試圖產(chǎn)生一個(gè)指向根本就不存在的東西的指針。這不是件好事。其結(jié)果未定義。一個(gè)較安全的方法是這樣:
if (!v.empty()) {
doSomething(&v[0], v.size());
}
如果你在一個(gè)不好的環(huán)境中,你可能會(huì)碰到一些半吊子的人物,他們會(huì)告訴你說(shuō)可以用v.begin()代替&v[0],因?yàn)椋ㄟ@些討厭的家伙將會(huì)告 訴你)begin返回指向vector內(nèi)部的迭代器,而對(duì)于vector,其迭代器實(shí)際上是指針。那經(jīng)常是正確的,但正如條款50所說(shuō),并不總是如此,你 不該依賴(lài)于此。begin的返回類(lèi)型是iterator,而不是一個(gè)指針,當(dāng)你需要一個(gè)指向vector內(nèi)部數(shù)據(jù)的指針時(shí)絕不該使用begin。如果你基 于某些原因決定鍵入v.begin(),就應(yīng)該鍵入&*v.begin(),因?yàn)檫@將會(huì)產(chǎn)生和&v[0]相同的指針,這樣可以讓你有更多 的打字機(jī)會(huì),而且讓其他要弄懂你代碼得人感覺(jué)到更晦澀。坦白地說(shuō),如果你正在和告訴你使用v.begin()代替&v[0]的人打交道的話,你該 重新考慮一下你的社交圈了。(譯注:在VC6中,如果用v.begin()代替&v[0],編譯器不會(huì)說(shuō)什么,但在VC7和g++中這么做的話, 就會(huì)引發(fā)一個(gè)編譯錯(cuò)誤)
聯(lián)系客服