2011-07-27 112 views
6

有没有人知道任何简单的方法来将CLI/.NET System ::数组转换为C++ std :: vector,除此之外元素明智吗?我正在接受一个System ::数组作为参数在CLI/C++中编写一个包装方法(SetLowerBoundsWrapper,见下文),并将等效的std :: vector传递给本地C++方法(set_lower_bounds)。目前,我这样做如下:将System :: array转换为std :: vector

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); 
} 

回答

10

另一种方法,让.NET BCL做的工作,而不是C++标准库:

#include <vector> 

void SetLowerBoundsWrapper(array<double>^ lb) 
{ 
    using System::IntPtr; 
    using System::Runtime::InteropServices::Marshal; 

    std::vector<double> lower(lb->Length); 
    Marshal::Copy(lb, 0, IntPtr(&lower[0]), lb->Length); 
    _opt->set_lower_bounds(lower); 
} 

编辑(响应评论对Konrad的回答):

下面这两个为我编译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); 
} 

(人工范围允许pin_ptr以尽早取消固定内存,以免妨碍GC)

+0

优秀的,谢谢。这工作第一次 – Rory

+1

对于那里的其他人太繁忙滚动,以阅读:_opt-> set_lower_bounds(下)是来自问题的函数:) –

相关问题