2011-07-27 20 views
6

Herkes bir CLI/.NET System :: dizisini C++ std :: vektörüne dönüştürmenin kolay bir yolunu biliyor mu?convert Sistem :: dizi için std :: vektör

Bir System :: dizini argüman olarak kabul eden CLI/C++ uygulamasında bir sarmalayıcı yöntemi (aşağıda SetLowerBoundsWrapper) yazdım ve eşdeğer std :: vektörünü yerel C++ yöntemine (set_lower_bounds) geçiriyorum. şöyle anda bunu yapmak:

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

cevap

10

başka yaklaşım, .NET BCL icar yerine standart kütüphanesinde C++ yaptığı işi yaparken yorumlara yanıt olarak

#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 (Konrad'ın cevabı üzerine):

Aşağıdaki ikisi de VC++ 2010 SP1 ile benim için derler ve tam olarak eşdeğerdir:

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

+0

Mükemmel, teşekkürler (yapay kapsam GC engel olmayacak şekilde pin_ptr, mümkün olduğu kadar erken hafıza sabitlemeyi kaldırmak için. Izin vermektir). Bu ilk kez çalıştı – Rory

+1

Diğer insanlar için orada okumak için çok meşgul kaydırma vardır: _opt-> set_lower_bounds (alt) sorudan gelen işlevdir :) –

İlgili konular