如何将System::array转换为std::vector? 有没有一种简单的方法将CLI/.NET 系统转换成:数组 > C++ >代码> STD::向量< /代码>,除了元素化?< /P>
我在CLI /C++中编写了一个包装方法(<代码> StWoLeWrnWrrsWrpector,),接受一个<代码>系统::数组< /CUT>作为参数,并将等效的<代码> STD::vector < /C> >到本机C++方法(<代码> SETIOLUR RealEngult)。目前我的做法如下:如何将System::array转换为std::vector? 有没有一种简单的方法将CLI/.NET 系统转换成:数组 > C++ >代码> STD::向量< /代码>,除了元素化?< /P>,.net,c++-cli,wrapper,.net,C++ Cli,Wrapper,我在CLI /C++中编写了一个包装方法( StWoLeWrnWrrsWrpector,),接受一个系统::数组< /CUT>作为参数,并将等效的 STD::vector < /C> >到本机C++方法( SETIOLUR RealEngult)。目前我的做法如下: using namespace System; void SetLowerBoundsWrapper(array<double>^ lb) { int n = lb->Length; std::v
using namespace System;
void SetLowerBoundsWrapper(array<double>^ lb)
{
int n = lb->Length;
std::vector<double> lower(n); //create a std::vector
for(int i = 0; i<n ; i++)
{
lower[i] = lb[i]; //copy element-wise
}
_opt->set_lower_bounds(lower);
}
使用名称空间系统;
void SetLowerBoundsWrapper(数组^lb)
{
int n=磅->长度;
std::vector lower(n);//创建一个std::vector
for(int i=0;iset_下界(下限);
}
另一种方法,让.NET BCL代替C++标准库来做这项工作:
#包括
void SetLowerBoundsWrapper(数组^lb)
{
使用System::IntPtr;
使用System::Runtime::InteropServices::封送;
标准::向量较低(磅->长度);
封送:复制(lb,0,IntPtr(&lower[0]),lb->Length);
_选择->设置下限(下限);
}
以下两个代码都是使用VC++2010 SP1为我编译的,并且完全等效:
#include <algorithm>
#include <vector>
void SetLowerBoundsWrapper(array<double>^ lb)
{
std::vector<double> lower(lb->Length);
{
pin_ptr<double> pin(&lb[0]);
double *first(pin), *last(pin + lb->Length);
std::copy(first, last, lower.begin());
}
_opt->set_lower_bounds(lower);
}
void SetLowerBoundsWrapper2(array<double>^ lb)
{
std::vector<double> lower(lb->Length);
{
pin_ptr<double> pin(&lb[0]);
std::copy(
static_cast<double*>(pin),
static_cast<double*>(pin + lb->Length),
lower.begin()
);
}
_opt->set_lower_bounds(lower);
}
#包括
#包括
void SetLowerBoundsWrapper(数组^lb)
{
标准::向量较低(磅->长度);
{
引脚(ptr引脚和磅[0]);
双*第一个(引脚),*最后一个(引脚+磅->长度);
std::copy(第一个、最后一个、下一个.begin());
}
_选择->设置下限(下限);
}
void SetLowerBoundsWrapper2(数组^lb)
{
标准::向量较低(磅->长度);
{
引脚(ptr引脚和磅[0]);
复制(
静态铸件(销),
静态铸造(销+磅->长度),
放低。开始()
);
}
_选择->设置下限(下限);
}
人工作用域是允许pin_ptr
尽早解锁内存,以免妨碍GC。我们看到这些有什么问题吗
#include <cstring>
#include <vector>
template<typename T>
cli::array<T> ^ pincpy_a_v(std::vector<T> & v) {
cli::array<T> ^ a(gcnew cli::array<T>(v.size()));
pin_ptr<T> a_ptr = &a[0];
std::memcpy(a_ptr, v.data(), v.size() * sizeof(T));
return a;
}
template<typename T>
std::vector<T> pincpy_v_a(cli::array<T> ^ a) {
auto v{std::vector<T>(a->Length)};
pin_ptr<T> a_ptr = &a[0];
std::memcpy(v.data(), a_ptr, a->Length * sizeof(T));
return v;
}
#包括
#包括
模板
cli::数组^pincpy\u a\u v(std::vector&v){
cli::array ^a(gcnew cli::array(v.size());
pin_ptr a_ptr=&a[0];
std::memcpy(a_ptr,v.data(),v.size()*sizeof(T));
返回a;
}
模板
std::vector pincpy_v_a(cli::array ^a){
自动v{std::vector(a->Length)};
pin_ptr a_ptr=&a[0];
std::memcpy(v.data(),a_ptr,a->Length*sizeof(T));
返回v;
}
对于那些忙于滚动而无法阅读的人来说:_opt->set_lower_bounds(lower)是问题中的函数:)