Преобразование словаря C # в карту C ++ - PullRequest
0 голосов
/ 07 июня 2018

Я получаю словарь из C # dll в код C ++ / CLI.Я пытаюсь преобразовать словарь в std :: map, который будет в дальнейшем использоваться старым кодом C ++.но я не в состоянии сделать.У меня есть функция, которая будет принимать словарь в качестве параметра и возвращать карту.

Это то, что я пытаюсь сделать-

std::map < std::wstring, std::map<int, int>> Convert(Dictionary<String^, Dictionary<int, int>^>^ myMap)
{
   std::map < std::wstring, std::map<int, int>> h_result;

   for (std::wstring& stringKey : myMap->Keys)
   {
       for (std::pair<int, int> intKey : (myMap->Values))
       {
           h_result.insert(stringKey, intKey);
       }
   }

return h_result;
}

Я получаю ошибкуво время итерации значений.

ошибка: это основанное на диапазоне выражение для for требует подходящей функции "begin", и ничего не найдено

Может кто-нибудь сказать, что этопроблема здесь?или, если есть лучший способ конвертировать Dictionary^ в std::map, пожалуйста, предложите мне.

Я новичок в словаре и std :: map.пожалуйста, дайте мне знать, если есть какая-то глупая ошибка с примером кода.

1 Ответ

0 голосов
/ 07 июня 2018

Вы (a) пытаетесь использовать циклы диапазона C ++ с Dictionary^ и (b) пытаетесь использовать типы System взаимозаменяемо со стандартными типами C ++.Все это не сработает.

Вам нужно сделать это более пошагово: итерируйте коллекции Dictionary^ с for each, преобразуйте строку String ^ в std :: wstring правильно и создайтеэлементы карты с std::make_pair.

Таким образом, ваша функция будет выглядеть примерно так (не проверено)

std::map <std::wstring, std::map<int, int>> Convert(Dictionary<String ^, Dictionary<int, int>^> ^myMap)
{
    std::map <std::wstring, std::map<int, int>> h_result;

    // iterate the outer dictionary
    for each(KeyValuePair<String ^, Dictionary<int, int>^> ^kvp1 in myMap)
        {
        std::wstring stringKey = marshal_as<std::wstring>(kvp1->Key);

        std::map<int, int> mapValues;

        // iterate the inner dictionary
        for each(KeyValuePair<int, int> ^kvp2 in kvp1->Value)
            {
            // insert in inner map
            mapValues.insert(std::make_pair(kvp2->Key, kvp2->Value));
            }

        // insert in outer map
        h_result.insert(std::make_pair(stringKey, mapValues));
        }

    return h_result;
}
...