You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:21:03