如何将System::array转换为std::vector? 有没有一种简单的方法将CLI/.NET 系统转换成:数组 > C++ >代码> STD::向量< /代码>,除了元素化?< /P>

如何将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

我在CLI /C++中编写了一个包装方法(<代码> StWoLeWrnWrrsWrpector,),接受一个<代码>系统::数组< /CUT>作为参数,并将等效的<代码> STD::vector < /C> >到本机C++方法(<代码> SETIOLUR RealEngult)。目前我的做法如下:

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)是问题中的函数:)