Подтвердить что ты не робот

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

У меня есть код 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 не очень быстр для моей цели, и я хотел бы перевести этот код на С++. Какая лучшая структура данных С++ используется для словаря python, который имеет кортежи в качестве своих ключей? Каким будет эквивалент С++ для вышеуказанного кода?

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

4b9b3361

Ответ 1

Словарем будет std:: map в С++, а кортеж с двумя элементами будет 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';
   }
}

Ответ 2

Тип

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
}

Ответ 3

Посмотрите Boost.python. Это для взаимодействия между python и С++ (в основном создание python-библиотек с использованием С++, а также для встраивания python в С++-программы). Большинство структур данных pythons и их эквиваленты С++ описаны (не проверено для того, что вы хотите).

Ответ 4

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

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

Ответ 5

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

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

  • Перевести словарь Python в строку YAML
  • Использование Python для вызова функции С++, завершенной с помощью SWIG, в качестве параметра используется строка YAML.
  • Используйте библиотеку С++ для анализа YAML и получения объекта std::map
  • Работает на объекте std:: map

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

Ответ 6

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

Ответ 7

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