python - swig 在 C++ 中运行的结果与在 python 中的不同
问题描述
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;
}}
这个递归函数是swig编译的,结果向量只返回最后一个元素,但是c++返回正常结果。这是.i文件:
%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"
解决方案
你的代码对我来说很合适。创建一个可重现的问题示例。这是我的演示模板工作的示例(SWIG 3.0.12、VS2015、Python 3.8):
%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)]
推荐阅读
- github - 如何在 github 上轻松查看带有 ipynb 扩展名的文件
- docker - Docker、微服务和网络
- java - 运行spring批处理作业时无法反序列化执行上下文异常
- javascript - Angular 8对象数组上的多个过滤器
- python - 多项式回归:ValueError:形状(88,1)和(3,1)未对齐:1(dim 1)!= 3(dim 0)
- python - pandas 从 url 读取 .csv,起始行的标题较少
- python-3.x - Keras版本问题有什么神奇的命令吗?
- html - 子 div 超出父 div
- php - 如果选项为否,则需要条件下拉菜单,如果不是,则只显示另一个,否则它必须为空
- node.js - 打字稿和猫鼬:保存到数据库