Когда я обхожу коллекцию, скажем, вектор Point
s, где Point
- это некоторая структура, содержащая данные x
, y
, z
или что-то еще, когда мне нужно преобразовать эти точкик другому типу по одной точке за раз, должен ли я считать это дорогостоящим копированием?
Например, если у меня есть vector<Point> v
, я, очевидно, стараюсь избегать:
vector<OtherPointType> vo;
// populate v
std::transform(v.begin(), v.end(), vo.begin(),
[](Point const& p) { return OtherPointType{p.x, p.y, p.z}; });
SomeOperation(vo); // Can only operate on vector<OtherPointType>
Но разве это так же дорого, как делать:
for_each(..., [](Point const& p)
{
OtherPointType opt(p.x, p.y, p.z);
SomeOperation(opt); // Can only operator on `OtherPointType`
});
?
Мой инстинкт говорит, что, поскольку последний является статической копией без каких-либо динамических выделений, он не должен быть дорогим, но я подумал, что это достаточно важно, чтобы спросить.
Обычно я могу использовать что-то вроде Eigen::Map
в последнем случае, но даже там я все еще пишу в два int
с (в стеке), я думаюиз-за Eigen::Stride
(это даже хорошее решение в этом случае?) Но есть и такие библиотеки, как CGAL, которые не имеют картографических возможностей, и мне любопытен хороший подход к работе с ними.
Обратите внимание, моя работа обычно имеет миллион очков в секунду, поэтомуВажно, чтобы я старался максимально сократить количество дорогих копий.
Обновление
К подвопросу, где мне было интересно, будет ли Eigen::Map
хорошо в последнем случае, указанном выше:
Я провел тест , и, по крайней мере, с gcc 5.4, даже с 100 миллионами очков, результаты слишком близки для вызова.При использовании Eigen::Map
против построение Eigen::Vector3d
заняло 276 мс против 285 мс соответственно.С меньшим количеством точек, хотя создание заняло меньше времени, что говорит мне, что разница здесь в неопределенности, и другие процессы, которые выполнялись на моем компьютере, вероятно, оказали большее влияние.