可以优雅地将std:vector转换为cliext :: vector或cli :: array <t>?</t>

时间:2010-09-03 00:39:44

标签: stl vector c++-cli

如何获得一个吸引人的头衔?

我需要从CLR兼容类型(如数组)和std :: vector类型来回转换。

是否有任何适配器方法,或者我每次调用我的本机方法时是否应该继续复制它?

有一些有趣的方法可以在cliext STL变体类和CLR类型之间进行转换,但是我不知道如何在没有for next循环的情况下将标准向量转换为STL类型。

这就是我在这个项目中所做的一切:

vector<double> galilVector = _galilClass->arrayUpload(marshal_as<string>(arrayName));
List<double>^ arrayList = gcnew List<double>();

// Copy out the vector into a list for export to .net
for(vector<double>::size_type i = 0; i < galilVector.size(); i++) 
{
    arrayList->Add(galilVector[i]);
}

return arrayList->ToArray();

3 个答案:

答案 0 :(得分:4)

为什么不把这个逻辑变成可重复使用的函数呢?

这样的东西
template<typename T>
generic<typename S>
std::vector<T> marshal_as(System::Collections::Generic::ICollection<S>^ list)
{
  if (list == nullptr) throw gcnew ArgumentNullException(L"list");
  std::vector<T> result;
  result.reserve(list->Count);
  for each (S& elem in list)
    result.push_back(marshal_as<T>(elem));
  return result;
}

请记住使用vector的swap成员函数快速将元素移动到您想要保存它们的向量中,如果您只是分配,那么将调用zillion复制构造函数。

答案 1 :(得分:0)

IList<int>^ Loader::Load(int id)
{
    vector<int> items;
    m_LoaderHandle->Loader->Load(id, items);

    cliext::vector<int> ^result = gcnew cliext::vector<int>(items.size());
    cliext::copy(items.begin(), items.end(), result->begin());

    return result;
}

答案 2 :(得分:0)

你可以试试这个:

&#13;
&#13;
cliext::vector<Single> vec_cliext; 
					
std::vector<float> vec_std;

cliext::vector<Single>::iterator it = vec_cliext.begin(); 
for (; it != vec_cliext.end(); ++it)
{
	float temp = *it;
	vec_std.push_back(temp);
}
&#13;
&#13;
&#13;