swig在C+中运行的结果+;与python中的不同 void BK::BKTree::recursiveSearchNew(BK::Node*Node,std::vector*r,字符串w, 尺寸(t){ 大小\u t curDist=levenshteindication(节点->单词,w); 大小思维者=curDist-t; 大小\u t最大值=curDist+t; if(curDist单词,curDist); r->推回(p); } Node*child=Node->leftChild; 如果(!child)返回; while(儿童) { 如果(在范围内(儿童->距离、心智、最大距离)) 递归搜索新(子、r、w、t); child=child->rightsbibling; }} 此递归函数由SWIG编译,结果向量只返回最后一个元素,但C++返回正常结果。这是文件。 void BK::BKTree::recursiveSearchNew(BK::Node *node, std::vector<std::pair<std::string, int> > *r, string w, size_t t) { size_t curDist = levenshteinDistance(node->word, w); size_t minDist = curDist - t; size_t maxDist = curDist + t; if (curDist <= t) { std::pair<string, int> p; p = std::make_pair(node->word, curDist); r->push_back(p); } Node* child = node->leftChild; if (!child) return; while (child) { if (inRange(child->distance, minDist, maxDist)) recursiveSearchNew(child, r, w, t); child = child->rightSibling; }} %bk模块 %包括 %包括 %包括 %template()std::pair; %模板(PairVector)std::vector; %模板(StringVector)std::vector; %{ #包括“BKTree.h” %} %包括“BKTree.h”
我觉得你很好。为你的问题创建一个可复制的例子。下面是我的示例,演示了模板的工作原理(SWIG 3.0.12、VS2015、Python 3.8):swig在C+中运行的结果+;与python中的不同 void BK::BKTree::recursiveSearchNew(BK::Node*Node,std::vector*r,字符串w, 尺寸(t){ 大小\u t curDist=levenshteindication(节点->单词,w); 大小思维者=curDist-t; 大小\u t最大值=curDist+t; if(curDist单词,curDist); r->推回(p); } Node*child=Node->leftChild; 如果(!child)返回; while(儿童) { 如果(在范围内(儿童->距离、心智、最大距离)) 递归搜索新(子、r、w、t); child=child->rightsbibling; }} 此递归函数由SWIG编译,结果向量只返回最后一个元素,但C++返回正常结果。这是文件。 void BK::BKTree::recursiveSearchNew(BK::Node *node, std::vector<std::pair<std::string, int> > *r, string w, size_t t) { size_t curDist = levenshteinDistance(node->word, w); size_t minDist = curDist - t; size_t maxDist = curDist + t; if (curDist <= t) { std::pair<string, int> p; p = std::make_pair(node->word, curDist); r->push_back(p); } Node* child = node->leftChild; if (!child) return; while (child) { if (inRange(child->distance, minDist, maxDist)) recursiveSearchNew(child, r, w, t); child = child->rightSibling; }} %bk模块 %包括 %包括 %包括 %template()std::pair; %模板(PairVector)std::vector; %模板(StringVector)std::vector; %{ #包括“BKTree.h” %} %包括“BKTree.h”,python,c++,c++14,swig,swig-template,Python,C++,C++14,Swig,Swig Template,我觉得你很好。为你的问题创建一个可复制的例子。下面是我的示例,演示了模板的工作原理(SWIG 3.0.12、VS2015、Python 3.8): %module bk %include <std_pair.i> %include <std_vector.i> %include <std_string.i> %template() std::pair<std::string,int>; %template(PairVector) std::
%module bk
%include <std_pair.i>
%include <std_vector.i>
%include <std_string.i>
%template() std::pair<std::string,int>;
%template(PairVector) std::vector<std::pair<std::string,int> >;
%template(StringVector) std::vector<std::string>;
%{
#include "BKTree.h"
%}
%include "BKTree.h"
%module bk
%{
#include <vector>
#include <string>
#include <utility>
void test(std::vector<std::pair<std::string,int>> *r)
{
auto p = std::make_pair(std::string{"hello"},5);
r->push_back(p);
p = std::make_pair("goodbye",7);
r->push_back(p);
}
%}
%include <std_pair.i>
%include <std_vector.i>
%include <std_string.i>
%template() std::pair<std::string,int>;
%template(PairVector) std::vector<std::pair<std::string,int> >;
void test(std::vector<std::pair<std::string,int>> *r);
>>> import bk
>>> v=bk.PairVector()
>>> bk.test(v)
>>> list(v)
[('hello', 5), ('goodbye', 7)]