Как итерировать (ключ, значение) boost :: python: dict - PullRequest
3 голосов
/ 25 сентября 2019

Как я могу выполнить итерацию в C ++ поверх моего boost :: python: dict ?Мне нужно ключ и значение в каждом цикле цикла.

Моя попытка была такой:

for (auto x : MyBoostPythonDict.iteritems())
{
    // determine key
    // determine value 
    // ...
}

Я получил эту ошибку: C3312 не найдена вызываемая функция 'end' для типа 'boost :: python :: api :: object'

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

Просто используйте список предметов напрямую:

for (auto x : MyBoostPythonDict.items())

Я предполагаю, что iteritems, вероятно, предназначен для использования примерно так:

for(auto it = D.iteritems(); it; ++it)
1 голос
/ 25 сентября 2019

Вы можете просто зациклить все пары ключ / значение следующим образом:

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];
    // ...
}

Теперь вам нужно извлечь соответствующие типы из key и value.Предполагая, что оба типа int вы бы использовали:

extract<int> key_int(key);
extract<int> value_int(value);

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