Перевод словаря Python на C ++ - PullRequest
       23

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

22 голосов
/ 04 декабря 2009

У меня есть код Python, который содержит следующий код.

d = {}

d[(0,0)] = 0
d[(1,2)] = 1
d[(2,1)] = 2
d[(2,3)] = 3
d[(3,2)] = 4

for (i,j) in d:
    print d[(i,j)], d[(j,i)]

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

Я посмотрел на разреженные матрицы в библиотеке наддува, но не смог найти простой способ зацикливания только ненулевых элементов.

Ответы [ 7 ]

39 голосов
/ 04 декабря 2009

Словарь был бы 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';
   }
}
8 голосов
/ 04 декабря 2009

Тип

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
}
4 голосов
/ 04 декабря 2009

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

3 голосов
/ 04 декабря 2009

std::map или более вероятно std::tr1::unordered_map / boost::unordered_map (он же hash_map) - это то, что вы хотите.

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

2 голосов
/ 20 мая 2016

Карта часто реализуется в виде сбалансированного двоичного дерева, а не хеш-таблицы. Это не тот случай для Python dict. Поэтому вам нужна эквивалентная структура данных C ++ O (1), чтобы использовать ваши пары с.

1 голос
/ 04 декабря 2009

Вы хотите вызвать оптимизированную подпрограмму 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" дает много интересных ссылок

0 голосов
/ 04 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...