【问题标题】:The result of swig running in C++ is different from that in pythonswig 在 C++ 中运行的结果与在 python 中的不同
【发布时间】:2019-11-08 08:05:14
【问题描述】:
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" 

【问题讨论】:

    标签: python c++ c++14 swig swig-template


    【解决方案1】:

    你的代码对我来说很合适。创建一个可重现的问题示例。这是我的演示模板正在工作的示例(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)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 2019-06-23
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多