Как дешево назначить массив в стиле C для std :: vector? - PullRequest
23 голосов
/ 29 апреля 2011

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

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

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

Ответы [ 4 ]

21 голосов
/ 29 апреля 2011

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

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

6 голосов
/ 29 апреля 2011

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

4 голосов
/ 30 апреля 2011

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

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

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

1 голос
/ 29 апреля 2011

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

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

...