其實 Vector 就是 C++ 容器符號的表徵(【{】和【}】) 圖片來源 |
最近,有人在群裡問了在C++ Builder裡要怎麼有效率的處理【動態陣列】,讓群裡頓時又熱鬧起來,而「陣列」就屬於「容器」的應用,在群裡被廣泛提到的有『TList』、『TStringList』等『VCL Framework』專屬容器,這不禁讓我回想起多年前與【Vector】的奮戰歷程。
Vector
C++標準函式庫的容器成員之一,和C#的泛型相比,C++顯得更早想到【容器】概念。Vector在C++界被廣泛應用,但不知道為什麼和VCL/FireMonkey framework就是難以結合應用,成為CB裡經典的遺珠之憾之一。
Vector:中文翻譯為【向量】,怎麼會跟向量扯上邊呢?
看到上面那張圖,我瞬間就了解了
C++函式裡的上括號( { ) 和下括號( } ),裡面確實是包含「動態」且「無數列」的程式碼啊!而上括號( { ) 和下括號( } )就是Vector具體化的符號,所以Vector可真是名符其實的【容器】呀!
而我們C++ Builder的Help寫的範例內容,截取如下:
const int ListSize = 12; int i; vector<int> MyVector(ListSize); for (i = 0; i < ListSize; ++i) { MyVector[i] = i * i; } for (i = 0; i < int(MyVector.size()); ++i) { ListBox1->Items->Add(MyVector[i]); }
只有片面的基礎型別的應用,經常應用的VCL物件卻完全沒有提到,想必這也是C++內基礎中的基礎…………吧?
不囉嗦,現在就來看看C++的Vector怎麼和VCL/FireMonkey framework結合吧!
void __fastcall TForm1::Button1Click(TObject *Sender) { vector<TDataModule2*>DMs; DMs.push_back(new TDataModule2(NULL)); // Iterator 的應用 vector<TDataModule2*>::iterator it; for (it=DMs.begin(); it!=DMs.end(); ++it) { (*it)->Message = "Eden: Hello VECTOR."; // 方法一:使用Iterator //ShowMessage(DMs[0]->Message); // 方法二:使用迴圈變數 ShowMessage((*it)->Message); // delete *it } for (int iPos=0; iPos!=(int)DMs.size(); ++iPos) { delete DMs[iPos]; } }
其實,如果C++ Builder能夠再多一點【C++標準函式庫】和【VCL/FireMonkey framework】綜合應用的資料,以VCL/FireMonkey framework易用度和發揮能力,使用 C++ Builder 的人一定會更多才是!
沒有留言:
張貼留言