推 DJWS:感謝! 原來是C++0x的新功能 :) 05/01 00:02
※ 引述《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)