Поделиться через


Практическое руководство. Преобразование из коллекции в контейнере STL/CLR .NET

В этом разделе показано, как преобразовать коллекции .NET в их контейнеров числа STL/CLR.По мере примере мы показано, как преобразовать .NET List<T> к вектор STL/CLR, и, как преобразовать .NET Dictionary<TKey, TValue> к схема STL/CLR, но процедура похожи для всех коллекций и контейнеров.

Создание контейнера из коллекции

  • Чтобы преобразовать коллекцию целиком, создайте контейнер STL/CLR и передайте коллекцию в конструктор.

    Первый пример демонстрирует эту процедуру.

— или —

  1. Создайте универсальный шаблон контейнер STL/CLR, создав объект collection_adapter.Этот класс шаблона принимает интерфейс коллекции .NET в качестве аргумента.Для проверки, интерфейсы поддерживаются см. в разделе collection_adapter (STL/CLR).

  2. Скопируйте содержимое коллекции .NET в контейнер.Это делается с помощью алгоритм STL/CLR, либо путем прохода по коллекции .NET и вставка копии каждого элемента в контейнер STL/CLR.

    Второй пример демонстрирует эту процедуру.

Пример

В этом примере создается универсальный шаблон List<T> и добавим 5 элементов на него.Затем создается vector, используя конструктор, который принимает в качестве аргумента IEnumerable<T>.

// 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 элементов на него.Далее создадим collection_adapter для создания программу-оболочку Dictionary<TKey, TValue> в качестве простого контейнера STL/CLR.Наконец, создадим map и копируем содержимое Dictionary<TKey, TValue> к map путем прохода по collection_adapter.Во время этого процесса, создадим новую пару с помощью функции 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

Ссылки

adapter (STL/CLR)

Другие ресурсы

Ссылка библиотека STL/CLR