将python字典翻译成C ++

时间:2009-12-03 21:10:20

标签: c++ python dictionary tuples

我有包含以下代码的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 ++。什么是用于python字典的最佳C ++数据结构,它以元组为键?上面代码的C ++等价物是什么?

我查看了boost库中的稀疏矩阵,但找不到一种只能在非零元素上循环的简单方法。

7 个答案:

答案 0 :(得分:39)

字典将是c ++中的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';
   }
}

答案 1 :(得分:8)

类型是

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
}

答案 2 :(得分:4)

看看Boost.python。这是python和C ++之间的交互(基本上使用C ++构建python库,但也用于在C ++程序中嵌入python)。描述了大多数蟒蛇数据结构及其C ++等价物(没有检查你想要的那个)。

答案 3 :(得分:3)

std::map或更有可能std::tr1::unordered_map / boost::unordered_map(又名hash_map)就是您想要的。

另外,正如克里斯所说,Boost.Python在这里看是个好主意。它已经提供了python的dict类的C ++版本,所以如果你正在做跨语言的东西,它可能会有用。

答案 4 :(得分:2)

Map通常实现为平衡二叉树而非哈希表。这不是Python dict的情况。因此,您需要一个C ++ O(1)等效数据结构来使用您的对。

答案 5 :(得分:1)

您想通过Python调用优化的C ++例程吗?如果是这样,请继续阅读:

在Python中处理字典时,我常常使用PyYaml。也许您可以将LibYAMLyamlcpp之类的内容链接到:

  1. 将Python词典翻译成YAML字符串
  2. 使用Python调用使用SWIG之类的东西包装的C ++函数,将YAML字符串作为参数。
  3. 使用C ++库解析YAML&amp;获取std::map对象
  4. 在std :: map对象上操作
  5. 警告:我从未尝试过这个,但在"yaml std::map"上使用每个人最喜欢的搜索引擎会产生很多有趣的链接

答案 6 :(得分:0)

作为您问题的直接答案(对于python部分,请查看我的其他答案)。如果你愿意,你可以忘记元组部分。您可以在C ++中使用任何映射类型键/值(哈希等),您只需要找到一个唯一的键功能。在某些情况下,这很容易。例如,如果两个整数是1到65536之间的整数,则可以使用32位整数,每个16位是其中一个键。一个简单的移位和一个'或'或+来组合这两个值就可以了,这非常有效。