![]() |
| 其實 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 的人一定會更多才是!


沒有留言:
張貼留言