感謝:http://topic.csdn.net/t/20050429/20/3976956.html
感謝:http://yzyanchao.blogbus.com/logs/47796444.html
不過那邊是轉載自《effective stl》。
std::vector很方便,但有時調用的函數的參數規定是數組,需要將vector轉為數組,另外開辟一個空間,將vector一項項復制過去代價過大,可用下面的方法。
給定一個
vector<int> v;
表達式v[0]生產一個指向vector中第一個元素的引用,所以,&v[0]是指向那個首元素的指針。vector中的元素被C++標准限定為存儲在連續內存中,就像是一個數組,所以,如果我們想要傳遞v給這樣的C風格的API:
void doSomething(const int* pInts, size_t numInts);
我們可以這么做:
doSomething(&v[0], v.size());
也許吧。可能吧。唯一的問題就是,如果v是空的。如果這樣的話,v.size()是0,而&v[0]試圖產生一個指向根本就不存在的東西的指針。這不是件好事。其結果未定義。一個較安全的方法是這樣:
if (!v.empty()) {
doSomething(&v[0], v.size());
}
如果你在一個不好的環境中,你可能會碰到一些半吊子的人物,他們會告訴你說可以用v.begin()代替&v[0],因為(這些討厭的家伙將會告 訴你)begin返回指向vector內部的迭代器,而對於vector,其迭代器實際上是指針。那經常是正確的,但正如條款50所說,並不總是如此,你 不該依賴於此。begin的返回類型是iterator,而不是一個指針,當你需要一個指向vector內部數據的指針時絕不該使用begin。如果你基 於某些原因決定鍵入v.begin(),就應該鍵入&*v.begin(),因為這將會產生和&v[0]相同的指針,這樣可以讓你有更多 的打字機會,而且讓其他要弄懂你代碼得人感覺到更晦澀。坦白地說,如果你正在和告訴你使用v.begin()代替&v[0]的人打交道的話,你該 重新考慮一下你的社交圈了。(譯注:在VC6中,如果用v.begin()代替&v[0],編譯器不會說什么,但在VC7和g++中這么做的話, 就會引發一個編譯錯誤)