2016/11/07

初探 C++【Vector容器】與【VCL/FireMonkey framework】的結合

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

沒有留言:

張貼留言

How to use URLEncode in Delphi

URL編碼,也稱【百分號編碼(Percent-encoding)】 由於 URL 不能直接接受 UTF8 文字,所以要先轉成百分號編碼後,如此網址才能順利送給 HTTP Server 從 Indy 加入 Delphi 後,就可以用 IdURI.TIdURI 單元進行編碼 ...