我有包含以下代码的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库中的稀疏矩阵,但找不到一种只能在非零元素上循环的简单方法。
答案 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。也许您可以将LibYAML或yamlcpp之类的内容链接到:
std::map
对象警告:我从未尝试过这个,但在"yaml std::map"上使用每个人最喜欢的搜索引擎会产生很多有趣的链接
答案 6 :(得分:0)
作为您问题的直接答案(对于python部分,请查看我的其他答案)。如果你愿意,你可以忘记元组部分。您可以在C ++中使用任何映射类型键/值(哈希等),您只需要找到一个唯一的键功能。在某些情况下,这很容易。例如,如果两个整数是1到65536之间的整数,则可以使用32位整数,每个16位是其中一个键。一个简单的移位和一个'或'或+来组合这两个值就可以了,这非常有效。