c++ stl vector轉數組(實際是數組的指標)

來源:互聯網
上載者:User

轉自:http://www.cnblogs.com/loongfee/archive/2012/05/05/2484574.html  

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++中這麼做的話, 就會引發一個編譯錯誤) 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.