python中的SWIG c++矢量访问

SWIG c++ vector access in python

本文关键字:访问 c++ 中的 SWIG python      更新时间:2023-10-16

这可能是一个菜鸟问题,但它就在这里。我已经使用 SWIG 将 3D 矢量包装到 python 模块中。一切都已编译,我可以导入模块并使用它执行操作。我似乎无法弄清楚如何在 python 中访问我的向量来存储和更改其中的值。如何在 python 中存储和更改我的矢量值。我的代码在下面,是为了测试算法 stl 是否适用于 SWIG 而编写的。它似乎确实有效,但我需要能够使用 python 将值放入我的向量中。

标题.h

 #ifndef HEADER_H_INCLUDED
 #define HEADER_H_INCLUDED
 #include <vector>
 using namespace std;
 struct myStruct{
 int vecd1, vecd2, vecd3;
 vector<vector<vector<double> > >vec3d;
 void vecSizer();
 void deleteDuplicates();
 double vecSize();
 void run();
 };
 #endif // HEADER_H_INCLUDED

主.cpp

 #include "header.h"
 #include <vector>
 #include <algorithm>
 void myStruct::vecSizer()
 {
     vec3d.resize(vecd1);
     for(int i = 0; i < vec3d.size(); i++)
     {
         vec3d[i].resize(vecd2);
         for(int j = 0; j < vec3d[i].size(); j++)
         {
             vec3d[i][j].resize(vecd3);
         }
     }
 }
 void myStruct::deleteDuplicates()
 {
     vector<vector<vector<double> > >::iterator it;
     sort(vec3d.begin(),vec3d.end());
     it = unique(vec3d.begin(),vec3d.end());
     vec3d.resize(distance(vec3d.begin(), it));
 }
 double myStruct::vecSize()
 {
     return vec3d.size();
 }
 void myStruct::run()
 {
     vecSizer();
     deleteDuplicates();
     vecSize();
 }

从终端(Ubuntu)

 import test #import the SWIG generated module
 x = test.myStruct() #create an instance of myStruct
 x.vecSize() #run vecSize() should be 0 since vector dimensions are not initialized
 0.0 
 x.vec3d #see if vec3d exists and is of the correct type
 <Swig Object of type 'vector< vector< vector< double > > > *' at       0x7fe6a483c8d0>

提前感谢!

事实证明,当生成包装器/接口时,向量被转换为不可变的 python 对象。简而言之,你不能修改来自python的包装的c ++向量。