gpt4 book ai didi

c++ - 使用 swig typemap 将 vector> & 从 c++ 方法返回到元组的 python 列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:20 30 4
gpt4 key购买 nike

我在尝试使用 %typemap(out) 包装一个将对 vector 对的常量引用返回到 Python 元组列表的 C++ 方法时遇到了很多麻烦。

我目前有这样的东西:

我的类.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;
}

我的类.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.i:(检查省略)

%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++;
}
}

好吧,我不太明白的第一件事是之前的类型映射 (out) 代码没有编译,因为它告诉我 $1 是指向容器的指针而不是引用。当我更改 $1 作为指针的使用时,它可以编译但不起作用。

其次,在编译的情况下,typemap(in) 工作(c++ 容器已正确填充),但是当我尝试从 python 检索容器时,我得到了垃圾。当我将类似 MyClass([(1,2)]) 的东西传递给构造函数时,然后我使用 GetMyVector() 它返回一个 python 列表,但大小为 3 并且元组上有垃圾......我做错了什么???

最佳答案

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

%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"

例子:

>>> import x
>>> a=x.PairVector(((1,2),(3,4),(5,6)))
>>> b=x.MyClass(a)
>>> b.GetMyVector()
((1, 2), (3, 4), (5, 6))

但请注意,因为您的类被编写为保存对传入 vector 的引用而不是拷贝,所以您必须在 MyClass 的生命周期内保存对它的引用。例如:

>>> del a
>>> b.GetMyVector()
*Undefined Behavior (crash, empty vector, etc.)*

关于c++ - 使用 swig typemap 将 vector<pair<int,int>> & 从 c++ 方法返回到元组的 python 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20125384/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com