SWIG封装C++向量比较扩展时Python列表无法传入vector问题求助
问题诊断与修正方案
存在的错误
- 头文件导入顺序错误:
ddd.h中using namespace std;写在标准库头文件导入之前,此时std命名空间尚未定义,会导致后续类型识别异常。 - SWIG未注册std::string类型转换:SWIG的
std_vector.i仅提供vector容器的类型映射,没有包含std::string和Python字符串的转换规则,导致传入Python字符串列表时无法匹配C++函数签名。 - SWIG接口文件存在冗余声明:已经通过
%include "ddd.h"导入函数声明,无需重复写extern函数定义,额外的冗余声明可能引发编译期符号冲突。 - Python测试代码类型调用错误:你在SWIG中定义
Line是一维字符串向量vector<string>,Array是二维字符串向量vector<vector<string>>,测试代码中给二维数组传参时错误调用了ddd.Line,应该用ddd.Array。
修正后的代码
1. ddd.h
#include <vector> #include <algorithm> #include <functional> #include <numeric> #include <iostream> #include <assert.h> #include <cstring> using namespace std; // 改用const引用传参,避免拷贝开销 vector<bool> comparer_cpp(const vector<vector<string> >& v, const vector<string>& v0);
2. ddd.i
%module ddd %{ #define SWIG_FILE_WITH_INIT #include "ddd.h" %} // 新增std::string和Python字符串的类型映射 %include "std_string.i" %include "std_vector.i" namespace std { %template(Line) vector<string>; %template(Array) vector<vector<string> >; } // 直接导入头文件即可,无需重复声明函数 %include "ddd.h"
3. ddd.cpp
#include "ddd.h" vector<bool> comparer_cpp(const vector<vector<string> >& v, const vector<string>& v0) { vector<bool> result; result.reserve(v.size()); // 预分配空间提升运行效率 for(unsigned int i=0;i<v.size();i++) { result.push_back((v0==v[i])); } return result; }
修正后的Python测试代码
import ddd # 一维向量用Line类型 vec1d=ddd.Line(["F06", "H10", "R07"]) # 二维向量用Array类型 vec2d=ddd.Array([["F06", "H10", "R07"], ["F06", "H10", "L20"], ["F06", "H10", "S12"]]) result_tuple=ddd.comparer_cpp(vec2d,vec1d) print(list(result_tuple)) # 运行输出: [True, False, False]
内容的提问来源于stack exchange,提问作者YoungMin Park
相关产品推荐
相关产品推荐

