What is the most efficient way to convert a std::vector to a .NET List?
To give some context, I am wrapping an unmanaged C++ class with C++/CLI. The C++/CLI class holds
If you're really that concerned about it, use unverifiable code instead:
List<unsigned>^ MethodA()
{
std::vector<unsigned> const& runList = mpChannelNode->runList();
array<unsigned>^ ret = gcnew array<unsigned>(runList.size());
if (runList.size())
{
pin_ptr<unsigned> dest = &ret[0];
std::memcpy(dest, &runList[0], runList.size() * sizeof(unsigned));
}
return gcnew List<unsigned>(ret);
}
That said, I'd be surprised if there was a noticeable difference either way...
I am not familiar with C++-CLI but one small improvement you can make is to create your list with the right capacity from the beginning.
List<UInt32> list = gcnew List<UInt32>(runList.size());
Another improvement would be to pre-increment your C++ iterator instead of post-incrementing it because currently you create an extra object for every element that is discarded immediately.
Consider turning into the vector directly into an array .. the below will work and be valid, until you resize the vector.
vector vec(10); int *array = &vec[0];
Then, you should be able to treat that (I think -- VS not on machine) as a passed array to populate your list.
You should also create your list with a size that you expect to need -- adding one by one will be slow.