Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将python字典翻译成C++;_C++_Python_Dictionary_Tuples - Fatal编程技术网

C++ 将python字典翻译成C++;

C++ 将python字典翻译成C++;,c++,python,dictionary,tuples,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库中的稀疏

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

类型为

std::map< std::pair<int,int>, int>
std::map
将条目添加到映射的代码如下所示:

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
}
typedef std::map容器;
容器m;
m[形成配对(1,2)]=3;/。。。
对于(容器::迭代器i=m.begin();i!=m.end();++i){

STD::CUT< P>字典是一个STD::C++中的映射,一个有两个元素的元组将是一个STD::对。 提供的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';
   }
}
#包括
#包括
typedef std::map Dict;
typedef Dict::const_迭代器It;
int main()
{
Dict d;
d[std::make_pair(0,0)]=0;
d[std::make_pair(1,2)]=1;
d[std::make_对(2,1)]=2;
d[std::make_对(2,3)]=3;
d[std::make_对(3,2)]=4;
for(It(d.begin());It!=d.end();+It)
{
inti(it->first.first);
intj(it->first.second);

STD::CUT

查看一下。它是用于Python和C++之间的交互(基本上是用C++构建Python LIBs,也可以在C++程序中嵌入Python)。大多数Python数据结构及其C++等价物都被描述(没有为你想要的对象检查)。.

std::map
或者更可能的情况是
std::tr1::无序映射
/
boost::无序映射
(又称
散列映射
)是您想要的


也可以说,正如KRISS所说的,Boosix.Python是一个很好的想法。它已经提供了Python的DICT类的C++版本,所以如果你在做跨语言的事情,它可能是有用的。< /P> < P>作为你的问题的直接答案(对于Python部分,看看我的其他答案)。如果需要,可以忽略元组部分。可以使用任何映射类型的键/值(哈希等)在C++中,你只需要找到一个唯一的键函数。在某些情况下,这是很容易的。例如,如果你的两个整数是1到65536之间的整数,你就可以使用一个32位整数,每一个16位的一个键。一个简单的移位,一个‘或’或+来组合这两个值将是个诀窍,而且非常有效。通过Python调用优化的C++例程?如果是,请继续阅读:

我经常使用Python处理字典。也许您可以链接到或:

  • 将Python字典转换为YAML字符串
  • 使用Python调用一个C++函数,用类似的方法包装,将yAML字符串作为参数。
  • 使用C++库解析YAML并获得 STD::MAP< /Cord>对象
  • 对std::map对象进行操作

  • 警告:我从来没有尝试过,但是使用每个人最喜欢的搜索引擎产生很多有趣的链接

    地图通常被实现为一个平衡的二进制树而不是哈希表。Python DICT不是这样的,所以你需要一个C++ O(1)。相当于使用双数据结构的.< /p>这确实很好。好工作。对像我这样的人来说,非常有指导性的工作,将他们的技能集从旧的C++升级到现代的C++。
    应该是
    it->second
    这似乎是由
    joshperry
    编辑引入的错误。请注意,对于C++14,
    std::make_pair(a,b)
    可以通过简单地编写
    {a,b}来替换
    ,这使它看起来更干净。当类型不是依赖名称时,您不能使用
    typename
    。@Roger:没错,修复了“typename容器::迭代器”是否考虑过其他数据布局。如果(i,j)始终与(j,i)成对出现那么您可能并不真的需要两者。您可以在构建字典时构建关联。您可以将(i,j)的dict存储在条目存储(d(i,j),d(j,i))中。这假设元组中的数字可以任意排序,这可能是真的。此外,如果您只是遍历元组,请将它们存储在列表中,然后遍历列表。