Я дам некоторый контекст того, почему я пытаюсь это сделать, но в конечном итоге контекст можно игнорировать, поскольку это в значительной степени классическая проблема компьютерных наук и C ++ (которую наверняка задавали раньше, но пара беглых поисков ничего не обнаружил ...)
Я работаю с (большими) облаками точек потоковой передачи в реальном времени, и у меня есть случай, когда мне нужно взять 2/3/4 облака точек с нескольких датчиков и соединить их вместе, чтобы создать одно большое облако точек. Я нахожусь в ситуации, когда мне действительно нужны все данные в одной структуре, тогда как обычно, когда люди просто визуализируют облака точек, они могут уйти, передав их в средство просмотра по отдельности.
Я использую Point Cloud Library 1.6, и при ближайшем рассмотрении ее Класс PointCloud (под <pcl/point_cloud.h>
, если вам интересно) хранит все точки данных в векторе STL.
Теперь мы вернулись на землю ванильной CS ...
В PointCloud есть оператор + = для добавления содержимого одного облака точек в другое. Все идет нормально. Но этот метод довольно неэффективен - если я правильно понимаю, он 1) изменяет размер целевого вектора, затем 2) проходит через все точки в другом векторе и копирует их.
Мне это выглядит как случай временной сложности O (n), что обычно может быть не так уж плохо, но является плохой новостью при работе с как минимум 300K точек на облако в реальном времени.
Векторы не нужно сортировать или анализировать, их просто нужно «склеить» на уровне памяти, чтобы программа знала, что как только она достигает конца первого вектора, ей просто нужно перейти в начальную точку второй. Другими словами, я ищу метод слияния векторов O (1). Есть ли способ сделать это в STL? Или это скорее домен чего-то вроде std :: list # splice?
Примечание. Этот курс является фундаментальной частью PCL, поэтому предпочтительнее «неинвазивная хирургия». Если необходимо внести изменения в сам класс (например, переход от вектора к списку или резервирование памяти), их следует рассматривать с точки зрения воздействия на остальную часть PCL, которое может иметь далеко идущие последствия.
Обновление: я зарегистрировал проблему в репозитории PCL на GitHub, чтобы обсудить с авторами библиотеки приведенные ниже предложения. Как только появится какое-то решение, к которому следует подходить, я приму соответствующие предложения в качестве ответов.
+=
. Если это действительноstd::vector
, не беспокойтесь об этом, это не ваша проблема. - person Mooing Duck   schedule 25.07.2013N
точку при ее создании, а затем удалив их все. - person Mooing Duck   schedule 25.07.2013