STL.NETとコレクションの相互運用
STLは素晴らしいライブラリですが、.NET Frameworkにもコレクション(System.Collection.Generic)があり、C++/CLI以外の言語も使う場合にはコレクションを使った方が何かと都合が良かったりします。STL.NETではその辺にも配慮されています。
void test() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); // to_arrayでarray型へ変換 array<int>^ intArray1 = v.to_array(); // vectorはICollectionを実装している array<int>^ intArray2 = gcnew array<int>(v.Count); v.CopyTo(intArray2, 0); // for eachも可 for each (int n in v) Console::WriteLine(n); // ListのコンストラクタはIEnumerableを取る List<int>^ l = gcnew List<int>(%v); }
このようにSTL.NETのコンテナクラスはIEnumerable/IEnumerator等を実装しています。
ところで上記を書いている時に、
vectorv; ... List ^ l = gcnew List (v);
としてしまい、コンパイルが通らずに嵌りまくりました。トラッキングハンドルを渡さないといけないことをつい忘れてしまいます。もし、高価なリソースを扱わないのなら、
vector^ v = gcnew vector ();
と、スタック割り当ては控えるようにした方が混乱しなくて良いかも知れませんね。