Перевод словаря на 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, но не смог найти простой способ петли только над ненулевыми элементами.
Ответы
Ответ 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-разрядной частью одной из ключей. Простой сдвиг и "или" или "+", чтобы объединить два значения, могли бы сделать трюк, и это очень эффективно.