C++Builder(およびDelphi)でよく使われるTStringListとかDynamicArrayを、std::vectorに変換したい場合がよくある。
この場合、いちいちループを回さなくても、STLライクなイテレータ操作が使える、ということを今さら公式ヘルプで知ったのでメモ。
TStringListからvector
TStringListからstd::vectorは以下のように一発で変換可能。
1 2 3 |
TStringList* SList = new TStringList; //・・・(いろいろ追加)・・・・・・ std::vector strings( begin(SList), end(SList) ); |
既存のvectorにはassignで代入。
1 2 |
std::vector v = { L"A", L"B" }; v.assign( begin(SList), end(SList) ); |
スマートポインタでも問題ない。
1 2 |
std::shared_ptr<TStringList> SList( new TStringList ); std::vector v( begin(SList.get()), end(SList.get()) ); |
文字列リストの基底クラスであるTStringsも同様。
おなじみのフォント一覧を取得するケース。
1 2 |
TStrings* Fonts = Screen->Fonts; std::vector fontnames( begin(Fonts), end(Fonts) ); |
ソートされた結果を最初から得たい場合は、std::setをいきなり初期化してもいい。
1 |
std::set s_set( begin(SList), end(SList) ); |
DynamicArrayからvector
Delphi動的配列型のDynamicArrayも似たような代入が可能。
1 2 3 4 5 6 |
DynamicArray i_darray; i_darray.set_length( 3 ); i_darray[0] = 0; i_darray[1] = 1; i_darray[2] = 3; std::vector v( i_darray.begin(), i_darray.end() ); |
IOUtilsのTDirectory::GetFilesはディレクトリ内の全ファイルを一発で取れる便利な関数だが、この返値TStringDynArrayはDynamicArray<String>のtypedefなので、同様にvector等に変換できる。
1 2 |
TStringDynArray Files = TDirectory::GetFiles( DirName ); std::vector files( Files.begin(), Files.end() ); |
以上、C++Builder10.2.3 / Windows10(21H2)で確認。