26

我有包含以下代码的 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 库中的稀疏矩阵,但找不到一种仅在非零元素上循环的简单方法。

4

7 回答 7

41

字典将是 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';
   }
}
于 2009-12-03T21:17:00.313 回答
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
}
于 2009-12-03T21:12:20.080 回答
5

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

于 2009-12-03T21:22:25.320 回答
3

std::map或更可能std::tr1::unordered_map/ boost::unordered_map(aka hash_map) 是你想要的。

此外,正如 kriss 所说,Boost.Python 是一个不错的选择。它已经提供了 python 的 dict 类的 C++ 版本,所以如果你正在做跨语言的东西,它可能会很有用。

于 2009-12-03T21:26:46.967 回答
2

Map 通常实现为平衡二叉树而不是哈希表。这不是 Python 字典的情况。所以你需要一个 C++ O(1) 等效的数据结构来使用你的对。

于 2016-05-20T20:24:57.183 回答
1

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

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

  1. 将 Python 字典翻译成 YAML 字符串
  2. 使用 Python 调用使用SWIG之类的东西包装的 C++ 函数,将 YAML 字符串作为参数。
  3. 使用 C++ 库解析 YAML 并获取std::map对象
  4. 对 std::map 对象进行操作

警告:我从未尝试过,但是在“yaml std::map”上使用每个人最喜欢的搜索引擎会产生很多有趣的链接

于 2009-12-03T22:10:06.010 回答
0

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

于 2009-12-03T21:37:56.150 回答