2011-07-27 40 views
6

Có ai biết cách nào dễ dàng để chuyển đổi một mảng CLI/.NET System :: thành một C++ std :: vector, ngoài việc làm nó thành phần khôn ngoan?convert System :: array thành std :: vector

Tôi đang viết một phương thức trình bao (SetLowerBoundsWrapper, bên dưới) trong CLI/C++ chấp nhận một mảng System :: làm đối số và chuyển vectơ std :: vectơ vào phương thức C++ gốc (set_lower_bounds). Hiện nay tôi làm điều này như sau:

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

Trả lời

10

cách tiếp cận khác, cho phép NET BCL làm công việc thay vì C++ thư viện tiêu chuẩn:

#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 (để phản ứng lại bình luận trên câu trả lời của Konrad):

Sau đây là cả hai biên dịch cho tôi với VC++ 2010 SP1 và chính xác tương đương:

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

(Phạm vi nhân tạo là để cho phép các pin_ptr để bỏ ghim bộ nhớ càng sớm càng tốt, để không làm cản trở việc GC.)

+0

Tuyệt vời, cảm ơn. Điều này làm việc lần đầu tiên – Rory

+1

Đối với những người khác ở ngoài đó là cách cuộn quá bận rộn để đọc: _opt-> set_lower_bounds (thấp hơn) là chức năng đó là đến từ câu hỏi :) –

Các vấn đề liên quan