Как дешево присваивать массив C-style std::vector?
В настоящее время я делаю следующее:
// float *c_array = new float[1024];
void Foo::foo(float *c_array, size_t c_array_size) {
//std::vector<float> cpp_array;
cpp_array.assign(c_array, c_array + c_array_size);
delete [] c_array;
}
Как я могу оптимизировать это назначение? Я бы хотел не выполнять элементную копию, а просто указывать swap-указатели.
Ответы
Ответ 1
Текущая std::vector
не предоставляет никаких возможностей или интерфейса для владения ранее выделенным хранилищем. Предположительно, было бы слишком легко передать адрес стека случайно, разрешив больше проблем, чем он решил.
Если вы хотите избежать копирования в вектор, вам нужно будет либо использовать векторы по всей цепочке вызовов, либо сделать это с помощью float[]
всего времени. Вы не можете их смешивать. Вы можете гарантировать, что &vec[0]
будет эквивалентно C-массиву, хотя и полностью смежным, поэтому использование вектора во всей программе может быть осуществимым.
Ответ 2
В настоящее время интерфейс std::vector
не обладает способностью перемещаться или заменять ничего, кроме другого std::vector
.
Ответ 3
Единственный способ сделать это - создать пользовательский распределитель.
-
Напишите класс распределителя, который вы можете инициализировать с помощью вашего массива.
-
Создайте вектор с помощью распределителя в качестве аргумента.
Ответ 4
Вряд ли это возможно - это довольно опасно, потому что std::vector не знает, как была распределена память и как она должна быть освобождена.
Если возможно, вы можете заменить исходное распределение на создание std::vector правильного размера. Он использует смежную область памяти, поэтому он может заменять вручную выделенный буфер.