关于c ++:iterate返回的向量< pair< int,int>>

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

我发现这个非常有用的问题和答案:返回向量< < int,int >和>从C++方法到使用SWIG类型映射的元组Python列表

但是,我在迭代返回向量时遇到了一些问题,如果返回向量不是引用,下面的示例:

我的H类:

1
2
3
4
5
6
7
8
9
10
11
12
13
#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:

1
2
3
4
5
6
7
8
#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;
};

我的班级。我:

1
2
3
4
5
6
7
8
9
10
11
12
13
%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"

编译时使用:

1
2
3
4
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

但是当我在python中运行类似这样的代码时:

1
2
3
4
5
6
7
8
import x

b=x.MyClass()

print(b.GetMyVector())

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

然后我得到:

1
2
3
4
5
6
7
<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

如何在python中正确迭代返回的向量?为什么返回向量指针?我需要更改swig文件中的内容吗?

如果相关:(在Ubuntu上)

  • swig版本2.0.11
  • G++(Ubuntu 4.9.4-2 Ubuntu1~14.04.1)4.9.4
  • Python2.7.6

Swig不正确理解using指令。

与此问题和答案相同:在Python中使用"使用STD::vector"时的SWIG参数错误

至于返回指针的原因,那么,如果swig无法将返回的对象转换为python对象,那么它会将指向该对象的指针包装起来。