使用python main.py
构建并调用后,结果如下:
[array([22209328,21870,0],dtype = int32),array([24088960,21870,1],dtype = int32)]
为什么会这样?我在代码中找不到错误。 我只正确每个数组的最后一个元素。其余显示一些我认为是地址的随机数。
预期输出:
[array([1,0,0],dtype = int32),array([2,1,1],dtype = int32)]
h_map.cpp
#include <stdio.h>
#include <math.h>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
map<int, vector<int> >hash_map()
{
map<int, vector<int> >dist;
for(int i=0;i<2;i++)
{
dist[i] = {i+1,i,i}; // 1,0,0 2,1,1
// 0 --> 1,2,3,
// 1-> 2,3,4
}
return dist;
}
h_map.h
#ifndef H_MAP_H
#define H_MAP_H
#include <vector>
#include <map>
using namespace std;
map<int, vector<int> >hash_map();
#endif
h_map.i
%module h_map
#define SWIGPYTHON_BUILTIN
%{
#include "numpy/arrayobject.h"
#define SWIG_FILE_WITH_INIT /* To import_array() below */
#include "h_map.h"
%}
%include "std_map.i"
%import "std_vector.i"
%include "numpy.i"
%init %{
import_array();
%}
namespace std {
%template(IntVector) vector<int>;
}
namespace std {
%template (mapiv) std::map<int,vector<int> >;
}
%typemap(out) std::map<int, std::vector<int> >
{
for(auto it:$1)
{
int subLength = it.second.size();
npy_intp dims[1] = {subLength };
PyObject* temp = PyArray_SimpleNewFromData(1, dims, PyArray_INT, it.second.data());
$result = SWIG_Python_AppendOutput($result, temp);
}
}
%include "h_map.h"```
build.sh
g++ -fPIC -c h_map.cpp
swig -python -c++ -o h_map_wrap.cpp h_map.i
g++ -fPIC -c $(pkg-config --cflags --libs python3) -I /home/kriti/anaconda3/lib/python3.7/site-packages/numpy/core/include h_map_wrap.cpp
g++ -shared h_map.o h_map_wrap.o -o _h_map.so -lm
main.py
import numpy as np
from h_map import hash_map
a = hash_map()
print(a)
更新:
map<int, vector<int> >dist;
for(int i=0;i<2;i++)
{
for (int j =0;j<3;j++)
dist[i].push_back(i*j);
}
这样做之后,问题仍然存在。