返回向量<;配对<;int,int>&燃气轮机&;来自c++;方法使用swig类型映射创建python元组列表 P> >我试图用一个C++方法返回一个常数,它将一对向量返回到一个元组的Python列表中,使用 %Type EMAP(OUT)< /C> >

返回向量<;配对<;int,int>&燃气轮机&;来自c++;方法使用swig类型映射创建python元组列表 P> >我试图用一个C++方法返回一个常数,它将一对向量返回到一个元组的Python列表中,使用 %Type EMAP(OUT)< /C> >,c++,python,vector,swig,C++,Python,Vector,Swig,我现在有这样的东西: myclass.h: #inlcude <vector> using std::vector; class MyClass { private: const vector<pair<int,int>> & _myvector; public: MyClass(const vector<pair<int,int>> & myvector ); const vector<p

我现在有这样的东西:

myclass.h:

#inlcude <vector>
using std::vector;
class MyClass {
private:
    const vector<pair<int,int>> & _myvector;
public:
    MyClass(const vector<pair<int,int>> & myvector );
    const vector<pair<int,int>> & GetMyVector() const;
}
#包括
使用std::vector;
类MyClass{
私人:
常数向量&_myvector;
公众:
MyClass(常量向量和myvector);
常量向量&GetMyVector()常量;
}
myclass.cpp:

#include "myclass.h"

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

const vector<pair<int,int>> & MyClass::GetMyVector() const {
    return _myvector;
};
#包括“myclass.h”
MyClass::MyClass(常量向量和myvector):\u myvector(myvector){};
常量向量&MyClass::GetMyVector()常量{
返回_myvector;
};
myclass.i:(检查ommited)

%模块MyClass
%包括“标准向量i”
名称空间标准{
%模板(向量对)向量;
}
%类型映射(in)(常量向量对int&){
$1=新向量;
int size=PyList_size($input);
对于(inti=0;ipush_-back(make_对(PyInt_-AsLong(o1),PyInt_-AsLong(o2)))
}
}
%类型映射(out)(常量向量对int&){
$result=PyList_New($1.size());
向量::常量迭代器it;
整数计数=0;
for(it=$1.begin();it!=$1.end();++it){
PyObject*tup=PyTuple\u Pack(2,it->first,it->second);
PyList_SET_项($result,count,tup);
计数++;
}
}
好的,我不太明白的第一件事是,前面的typemap(out)代码没有编译,因为它告诉我$1是指向容器的指针,而不是引用。当我更改$1作为指针的用法时,它编译了,但不起作用


第二,在编译的情况下,类型映射(in)工作(C++容器被正确填充),但是当我试图从Python检索容器时,我得到垃圾。当我传递给构造函数类似MyClass([1,2)],然后我使用GETMyVCIETHORE()它返回一个python列表,但大小为3,元组上有垃圾……我做错了什么?

这种情况下不需要自定义类型映射。SWIG内置了对向量和对模板的支持,但您必须声明对模板以及向量模板:

%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"
但请注意,因为您的类是为了保存对传入向量的引用而不是副本而编写的,所以您必须在MyClass的生存期内保存对它的引用。例如:

>>> del a
>>> b.GetMyVector()
*Undefined Behavior (crash, empty vector, etc.)*
>>> import x
>>> a=x.PairVector(((1,2),(3,4),(5,6)))
>>> b=x.MyClass(a)
>>> b.GetMyVector()
((1, 2), (3, 4), (5, 6))
>>> del a
>>> b.GetMyVector()
*Undefined Behavior (crash, empty vector, etc.)*