看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《DJWS (...)》之銘言: : 各位好, : 我想弄一個 vector,每一格可以放一個大小為五的陣列, : 可能會像這樣: : vector<int[5]> v; : v.push_back((int[5]){1,2,3,4,5}); : v[0][3] = 3; : 或者像這樣: : vector<int[5]> v; : int a[5] = {1,2,3,4,5}; : v.push_back(a); : v[0][3] = 3; : 我用了上面兩種方式都無法成功編譯, : 應該要怎麼做才好呢? : (還是我應該乖乖用個struct把int[5]包起來...?) - 需求萃取: 1. 需要建立一種物件, 能採用 initializer( 如:{1,2,3,4,5}) 來做初始化(透過conversion或是傳入ctor) 2. 該物件所屬類別必須可以滿足std::vector<T>對於value_type 的要求(擁有預設建構子等...) 3. 同 2, 該類別必須定義 operator[] 作為隨機存取元素之用 - 在 FDIS 中, std::vector<T> 就擁有你想要的功能, 因為它提供 了這種版本的建構子: vector(initializer_list<T>, const Allocator& = Allocator()); 所以當你寫下了下面的程式碼片段: vector<int> v = { 1, 2, 3 }; // 等同於 vector<int> v( { 1, 2, 3 } ); 程式會生成一個暫時物件, 型別為 initializer_list<int>, 並且 以 { 1, 2, 3 }作為元素的值, 讓 v初始化時作為讀取之用( 只能 讀取). 再來你的程式碼更可以改成: vector< vector<int> > v; v.push_back({1,2,3,4,5}); v[0][3] = 3; 直接編譯沒問題, 這也可以達成 Jagged-Array 形式的結構: vector< vector<int> > v; v.push_back({1,2,3,4,5}); v.push_back({6,7}); v[0].at(2) = -1; // okay v[1].at(2) = 0; // runtime error 請使用 gcc 4.4 以上版本才有對 initializer_list的支援, 詳細 的使用方法可以參考 FDIS 18.9 - * C++ and Beyond: Meyers, Sutter, & Alexandrescu, Aug 7-10 in Banff (http://cppandbeyond.com/) -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (04/30 23:52)
DJWS:感謝! 原來是C++0x的新功能 :) 05/01 00:02