Перевод словаря Python к C++

Вы делаете это немного более сложным, чем это должно быть. Давайте запустимся с конца Вашего примера:

String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );

С небольшим изменением использования StringBuilder вместо Строки, это становится:

StringBuilder parameterString = new StringBuilder();
if (condition) parameterString.append("elementName").append(",");
if (anotherCondition) parameterString.append("anotherElementName").append(",");
...

, Когда Вы сделаны (я принимаю, необходимо проверить несколько других условий также), просто удостоверьтесь, что Вы удаляете запятую конца с командой как это:

if (parameterString.length() > 0) 
    parameterString.deleteCharAt(parameterString.length() - 1);

И наконец, получите строку, которую Вы хотите с

parameterString.toString();

, Вы могли также заменить"", во втором вызове для добавления с универсальной строкой разделителя, которая может быть установлена на что-либо. Если у Вас есть список вещей, Вы знаете, что необходимо добавить (неусловно), Вы могли поместить этот код в методе, который берет список строк.

22
задан dzhelil 3 December 2009 в 21:10
поделиться

6 ответов

Словарь будет std :: map в C ++, а кортеж с двумя элементами будет std :: pair.

Предоставленный код Python будет преобразован в:

#include <iostream>
#include <map>

typedef std::map<std::pair<int, int>, int> Dict;
typedef Dict::const_iterator It;

int main()
{
   Dict d;

   d[std::make_pair(0, 0)] = 0;
   d[std::make_pair(1, 2)] = 1;
   d[std::make_pair(2, 1)] = 2;
   d[std::make_pair(2, 3)] = 3;
   d[std::make_pair(3, 2)] = 4;

   for (It it(d.begin()); it != d.end(); ++it)
   {
      int i(it->first.first);
      int j(it->first.second);
      std::cout <<it->second <<' '
                <<d[std::make_pair(j, i)] <<'\n';
   }
}
39
ответ дан 29 November 2019 в 03:57
поделиться

Тип

std::map< std::pair<int,int>, int>

Код для добавления записей в карту выглядит следующим образом:

typedef  std::map< std::pair<int,int>, int> container;

container m;

m[ make_pair(1,2) ] = 3; //...

for(container::iterator i = m.begin();  i != m.end(); ++i){
   std::cout << i.second << ' '; 
   // not really sure how to translate [i,j] [j,i] idiom here easily
}
8
ответ дан 29 November 2019 в 03:57
поделиться

Взгляните на Boost.python . Это' s для взаимодействия между Python и C ++ (в основном создание библиотек Python с использованием C ++, но также для встраивания Python в программы на C ++). Описано большинство структур данных питонов и их эквиваленты на C ++ (не проверены на тот, который вам нужен).

4
ответ дан 29 November 2019 в 03:57
поделиться

std :: map или более вероятно std :: tr1 :: unordered_map / boost :: unordered_map (также известный как hash_map ) это то, что вам нужно.

Кроме того, как сказал Крисс, Boost.Python - хорошая идея, чтобы посмотреть здесь. Он уже предоставляет версию класса dict python для C ++, поэтому, если вы делаете кросс-языковой материал, это может быть полезно.

3
ответ дан 29 November 2019 в 03:57
поделиться

Вы хотите вызвать оптимизированную подпрограмму C ++ через Python? Если да, читайте дальше:

Часто я использую PyYaml при работе со словарями в Python. Возможно, вы могли бы связать что-то вроде LibYAML или yamlcpp , чтобы:

  1. Перевести словарь Python в строку YAML
  2. Использовать Python для вызова функции C ++, обернутой с использованием чего-то вроде SWIG , принимающий строку YAML в качестве параметра.
  3. Используйте библиотеку C ++ для анализа YAML и получения объекта std :: map
  4. Работайте с объектом std :: map

Предупреждение: я никогда не пробовал это, но использование всеми любимой поисковой системы на "yaml std :: map" дает много интересных ссылок

1
ответ дан 29 November 2019 в 03:57
поделиться

Как прямой ответ на ваш вопрос (для части Python посмотрите мой другой ответ). Вы можете забыть о кортеже, если хотите. Вы можете использовать ключ / значение любого типа сопоставления (хэш и т. Д.) В C ++, вам просто нужно найти уникальную ключевую функцию. В некоторых случаях это может быть легко. Например, если у вас два целых числа - это целые числа от 1 до 65536, вы просто можете использовать 32-битное целое число с каждой 16-битной частью первого ключа. Простой сдвиг и «или» или + для объединения двух значений помогут, и это очень эффективно.

0
ответ дан 29 November 2019 в 03:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: