use*_*679 5 c++ python swig vector
我有很多麻烦试图包装一个c ++方法,该方法返回对使用的元组的Python列表的对向量的常量引用%typemap(out).
我目前有这样的事情:
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
myclass.i :(检查ommited)
%module MyClass
%include "std_vector.i"
namespace std {
%template(vector_pair_int) vector<pair<int,int>>;
}
%typemap(in) (const vector_pair_int &){
$1 = new vector<pair<int,int>>;
int size = PyList_Size($input);
for (int i=0; i<size; i++){
PyObject *o = PyList_GetItem($input,i);
PyObject *o1 = PyList_GetItem(o,0);
PyObject *o2 = PyList_GetItem(o,1);
$1->push_back(make_pair(PyInt_AsLong(o1),PyInt_AsLong(o2)))
}
}
%typemap(out) (const vector_pair_int &) {
$result = PyList_New($1.size());
vector<pair<int,int>>:: const_iterator it;
int count=0;
for (it= $1.begin(); it!= $1.end(); ++it){
PyObject * tup = PyTuple_Pack(2, it->first,it->second);
PyList_SET_ITEM($result,count,tup);
count++;
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我不太明白的第一件事是,前面的typemap(out)代码没有编译,因为它告诉我$ 1是指向容器而不是引用的指针.当我将$ 1的使用更改为指针时,它会编译,但它不起作用.
第二,在编译的情况下,typemap(in)有效(c ++容器正确填充),但是当我尝试从python中检索容器时,我得到了垃圾.当我传递给构造函数像MyClass的([(1,2)]),然后我用GetMyVector()返回一个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"
Run Code Online (Sandbox Code Playgroud)
例:
>>> import x
>>> a=x.PairVector(((1,2),(3,4),(5,6)))
>>> b=x.MyClass(a)
>>> b.GetMyVector()
((1, 2), (3, 4), (5, 6))
Run Code Online (Sandbox Code Playgroud)
但请注意,因为您的类被编写为保存对传入向量的引用而不是副本,所以您必须在MyClass的生命周期内保留对它的引用.例如:
>>> del a
>>> b.GetMyVector()
*Undefined Behavior (crash, empty vector, etc.)*
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3054 次 |
| 最近记录: |