如何迭代(键、值)boost::python:dict

如何迭代(键、值)boost::python:dict,python,c++,python-2.7,boost,Python,C++,Python 2.7,Boost,如何在我的boost::python:dict上迭代C++? 我需要在每一轮循环中使用键和值 我的尝试是: for (auto x : MyBoostPythonDict.iteritems()) { // determine key // determine value // ... } 我得到了这个错误: C3312未找到类型“boost::python::api::object”的可调用“end”函数 for (auto x : MyBoostPythonDic

如何在我的boost::python:dict上迭代C++? 我需要在每一轮循环中使用键和值

我的尝试是:

for (auto x : MyBoostPythonDict.iteritems())
{
    // determine key
    // determine value 
    // ...
}
我得到了这个错误:
C3312未找到类型“boost::python::api::object”的可调用“end”函数

for (auto x : MyBoostPythonDict.items())

我猜,
iteritems
很可能是这样使用的:

for(auto it = D.iteritems(); it; ++it)

您只需按如下方式循环所有键/值对:

using namespace boost::python;

list items = MyBoostPythonDict.items();
for(ssize_t i = 0; i < len(items); ++i) {
    object key = items[i][0];
    object value = items[i][1];
    // ...
}

PosithPython在“STLyIdultActer”头中公开了一些STL迭代器包装器,使您可以从“代码>开始/代码>到<代码>结束>代码>,就像普通C++迭代:

对于Python版本2,您可以使用
d.items()
d.iteritems()
,这取决于您是否希望延迟迭代。对于Python版本3,有一个小问题-您可能希望
是一个懒惰的
dict
视图,但Boost Python会将其转换为列表。因此,我调用了
.attr(“items”)()
来绕过内部转换,从而得到一个惰性包装。我将这个对象返回给Python只是为了确认它是视图而不是列表

调用
stl\u input\u iterator()
可以为(Python)元组对象提供一个迭代器,您可以从中提取键和值

#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间boost::python;
对象打印目录到目录(目录d){
auto items=d.attr(“items”)();//对于Python 2,只需普通的d.items或d.iteritems!
对于(自动it=stl_输入_迭代器(项目);it!=stl_输入_迭代器();++it){
元组kv=*it;
自动键=千伏[0];
自动值=千伏[1];

std::我无法感谢您的回答。他对“++it”或“it++”有问题:-->“boost::python::api::object”未定义此运算符,也未定义到预定义运算符可接受的类型的转换operator@bobmorane那么使用
items()呢
directly?你说directly是什么意思?@bobmorane如果你能提供一个最小且完整的示例,我可以对答案进行改进。@bobmorane的要点是:我不必亲自编写示例来帮助你-你可以很容易地提供。请参阅可能相关的内容:和。你使用的是什么版本的python?我使用的是python 2.7Che退出。你知道dict中键和值的类型吗?
extract<int> key_int(key);
extract<int> value_int(value);

if (key_int.check() && value_int.check()) {
    cout << key_int << ": " << value_int << endl;
}