方法: .NET コレクションを STL/CLR コンテナーに変換する
このトピックでは、同等の STL/CLR コンテナーに .NET の収集を変換する方法を示します。一例として、 STL/CLR ベクター に .NET List<T> を変換する方法と、 STL/CLR マップに .NET Dictionary<TKey, TValue> を変換する方法を示します。このプロシージャは、すべての収集やコンテナーに似ています。
コレクションのコンテナーを作成するには
全体の収集を変換するには、 STL/CLR のコンテナーを作成し、コンストラクターに収集を渡します。
最初の例は、この手順を示します。
または
collection_adapter のオブジェクトを作成してジェネリック STL/CLR コンテナーを作成します。このテンプレート クラスは、引数として .NET コレクションのインターフェイスを受け取ります。どのインターフェイスがサポートされているかを確認するには、 collection_adapter (STL/CLR)を参照してください。
コンテナーに .NET のコレクションの内容をコピーします。これは、 STL/CLR アルゴリズムを使用するか、 .NET のコレクションを反復処理し、 STL/CLR コンテナーに各要素のコピーを挿入することによって行うことができます。
2 番目の例は、この手順を示します。
使用例
この例では、ジェネリック List<T> を作成し、 5 個の要素を追加します。その後、引数として IEnumerable<T> を受け取るコンストラクターを使用して vector を作成します。
// cliext_convert_list_to_vector.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/algorithm>
#include <cliext/vector>
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Generic;
int main(array<System::String ^> ^args)
{
List<int> ^primeNumbersColl = gcnew List<int>();
primeNumbersColl->Add(2);
primeNumbersColl->Add(3);
primeNumbersColl->Add(5);
primeNumbersColl->Add(7);
primeNumbersColl->Add(11);
cliext::vector<int> ^primeNumbersCont =
gcnew cliext::vector<int>(primeNumbersColl);
Console::WriteLine("The contents of the cliext::vector are:");
cliext::vector<int>::const_iterator it;
for (it = primeNumbersCont->begin(); it != primeNumbersCont->end(); it++)
{
Console::WriteLine(*it);
}
}
この例では、ジェネリック Dictionary<TKey, TValue> を作成し、 5 個の要素を追加します。次に、まず、簡単な STL/CLR のコンテナーとして Dictionary<TKey, TValue> をラップするに collection_adapter を作成します。最後に、 map を作成し、 map に collection_adapterの反復処理によって Dictionary<TKey, TValue> の内容をコピーします。このプロセスの間に、 make_pair の関数を使用して新しいペアを作成し、 mapに新しいペアを挿入します。
// cliext_convert_dictionary_to_map.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/algorithm>
#include <cliext/map>
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Generic;
int main(array<System::String ^> ^args)
{
System::Collections::Generic::Dictionary<float, int> ^dict =
gcnew System::Collections::Generic::Dictionary<float, int>();
dict->Add(42.0, 42);
dict->Add(13.0, 13);
dict->Add(74.0, 74);
dict->Add(22.0, 22);
dict->Add(0.0, 0);
cliext::collection_adapter<System::Collections::Generic::IDictionary<float, int>> dictAdapter(dict);
cliext::map<float, int> aMap;
for each (KeyValuePair<float, int> ^kvp in dictAdapter)
{
cliext::pair<float, int> aPair = cliext::make_pair(kvp->Key, kvp->Value);
aMap.insert(aPair);
}
Console::WriteLine("The contents of the cliext::map are:");
cliext::map<float, int>::const_iterator it;
for (it = aMap.begin(); it != aMap.end(); it++)
{
Console::WriteLine("Key: {0:F} Value: {1}", it->first, it->second);
}
}
参照
処理手順
方法: STL/CLR コンテナーを .NET コレクションに変換する