Как дешево назначить массив в стиле C для std :: vector?

c++ arrays stl vector stdvector

11827 просмотра

4 ответа

3061 Репутация автора

В настоящее время я делаю следующее:

// 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;
}

Как я могу оптимизировать это назначение? Я хотел бы не выполнять поэлементное копирование, а просто поменять местами указатели.

Автор: Dmitriy Источник Размещён: 29.04.2011 07:09

Ответы (4)


6 плюса

125826 Репутация автора

В настоящее время std::vectorинтерфейс не обладает способностью перемещаться или менять что-либо, кроме другого std::vector.

Автор: Puppy Размещён: 29.04.2011 07:22

1 плюс

5721 Репутация автора

Маловероятно, что это возможно - это довольно опасно, потому что std :: vector не знает, как была выделена память и как она должна быть освобождена.

Если это возможно, вы можете заменить исходное размещение созданием std :: vector правильного размера. Он использует непрерывную область памяти, поэтому он может заменить выделенный вручную буфер.

Автор: maxim1000 Размещён: 29.04.2011 07:27

21 плюса

87725 Репутация автора

Решение

Ток std::vectorне предоставляет никаких возможностей или интерфейса для того, чтобы стать владельцем ранее выделенного хранилища. Предположительно было бы слишком легко передать адрес стека случайно, что позволило бы решить больше проблем, чем решило.

Если вы хотите избежать копирования в вектор, вам нужно либо использовать векторы по всей цепочке вызовов, либо делать это C float[]постоянно. Вы не можете смешивать их. Вы можете гарантировать, что &vec[0]он будет эквивалентен C-массиву, хотя и полностью смежный, поэтому использование вектора во всей программе может быть осуществимо.

Автор: Mark B Размещён: 29.04.2011 07:29

4 плюса

6185 Репутация автора

Единственный способ сделать это - создать собственный распределитель.

  1. Напишите класс распределителя, который вы можете инициализировать с помощью вашего массива.

  2. Создайте вектор с помощью распределителя в качестве аргумента.

Автор: Michael J Размещён: 29.04.2011 09:27
Вопросы из категории :
32x32