2011-07-27 14 views
6

CLI/.NET System :: arrayをC++ std :: vectorに変換する簡単な方法は誰も知っていますか?System :: arrayをstd :: vectorに変換する

私は、System :: arrayを引数として受け取り、同等のstd :: vectorをネイティブのC++メソッド(set_lower_bounds)に渡すCLI/C++でラッパーメソッド(以下のSetLowerBoundsWrapper)を作成しています。次のように現在、私はこれを行う:

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

EDIT(コメントに反応してコンラッドの答えに):

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

(人工スコープは、GCを妨げないようにpin_ptrは、できるだけ早期にメモリの固定を解除することができるようにすることです。)

+0

優れた、ありがとう。これは最初に働いた – Rory

+1

他の人のためには、あまりにも忙しいので、スクロールして読むことができません:_opt-> set_lower_bounds(下)は質問から来ている関数です:) –

関連する問題