gpt4 book ai didi

.net - 如何将 System::array 转换为 std::vector?

转载 作者:行者123 更新时间:2023-12-03 15:58:02 29 4
gpt4 key购买 nike

有什么简单的方法可以转换 CLI/.NET System::array到 C++ std::vector ,除了按元素做?

我正在 CLI/C++ 中编写一个接受 SetLowerBoundsWrapper, below 的包装方法( System::array )作为参数,并传递等效的 std::vector到 native C++ 方法 ( set_lower_bounds )。目前我这样做如下:

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

最佳答案

另一种方法,让 .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);
}

以下都使用 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尽早unpin内存,以免阻碍GC。

关于.net - 如何将 System::array 转换为 std::vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6846880/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com