简体   繁体   中英

iterate returned vector<pair<int,int>> in python from SWIG bindings

I found this very helpful question and answer: Return vector<pair<int,int>> & from c++ method to python list of tuples using swig typemap

However I have some problems iterating the return vector if it's not a reference, here the example:

myclass.h:

#include <vector>
#include <utility>

using std::vector;
using std::pair;
class MyClass {
private:
    vector<pair<int,int> > _myvector;

public:
    MyClass( );
    const vector<pair<int,int> > & GetMyVector() const;
};

myclass.cpp:

#include "myclass.h"

MyClass::MyClass(): _myvector()
{_myvector.push_back(std::make_pair(1,2));_myvector.push_back(std::make_pair(1,2));};

const vector<pair<int,int>> & MyClass::GetMyVector() const {
    return _myvector;
};

myclass.i:

%module x

%include <std_pair.i>
%include <std_vector.i>
%include <std_string.i>
%template() std::pair<int,int>;
%template(PairVector) std::vector<std::pair<int,int> >;

%{
#include "myclass.h"
%}

%include "myclass.h"

compiled with:

g++ -std=c++11 -c -fPIC myclass.cpp 
swig -c++ -v -python myclass.i 
g++ -std=c++11 -fPIC -c myclass.cpp myclass_wrap.cxx -I/usr/include/python2.7
g++ myclass.o myclass_wrap.o -shared -fPIC -o _x.so

but when I run something like this in python:

import x

b=x.MyClass()

print(b.GetMyVector())

for a,b in b.GetMyVector():
    print(a,b)

then I get:

<Swig Object of type 'vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > *' at 0x7ff06804b1b0>


Traceback (most recent call last):
  File "Test.py", line 6, in <module>
    for a,b in b.GetMyVector():
TypeError: 'SwigPyObject' object is not iterable

How can I iterate the returned vector properly in python? And why is a pointer to vector returned? Do I have to change something in the swig file?

In case it is relevant: (on Ubuntu)

  • SWIG Version 2.0.11
  • g++ (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4
  • Python 2.7.6

SWIG doesn't understand the using directive correctly.

Same as in this question and answer: SWIG argument error when using "using std::vector" in python

As to why a pointer is returned, well, if SWIG cannot convert a returned object into a python object, then it wraps a pointer to the object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM