2011-07-27 156 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(下)是來自問題的函數:) –

相關問題