Как дешево назначить массив в стиле C для std :: vector?
11827 просмотра
4 ответа
В настоящее время я делаю следующее:
// 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 Источник Размещён: 12.11.2019 09:34Ответы (4)
21 плюса
Ток std::vector
не предоставляет никаких возможностей или интерфейса для того, чтобы стать владельцем ранее выделенного хранилища. Предположительно было бы слишком легко передать адрес стека случайно, что позволило бы решить больше проблем, чем решило.
Если вы хотите избежать копирования в вектор, вам нужно либо использовать векторы по всей цепочке вызовов, либо делать это C float[]
постоянно. Вы не можете смешивать их. Вы можете гарантировать, что &vec[0]
он будет эквивалентен C-массиву, хотя и полностью смежный, поэтому использование вектора во всей программе может быть осуществимо.
6 плюса
В настоящее время std::vector
интерфейс не обладает способностью перемещаться или менять что-либо, кроме другого std::vector
.
4 плюса
Единственный способ сделать это - создать собственный распределитель.
Напишите класс распределителя, который вы можете инициализировать с помощью вашего массива.
Создайте вектор с помощью распределителя в качестве аргумента.
1 плюс
Маловероятно, что это возможно - это довольно опасно, потому что std :: vector не знает, как была выделена память и как она должна быть освобождена.
Если это возможно, вы можете заменить исходное размещение созданием std :: vector правильного размера. Он использует непрерывную область памяти, поэтому он может заменить выделенный вручную буфер.
Автор: maxim1000 Размещён: 29.04.2011 07:27Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- arrays Как удалить дубликаты из массива C #?
- arrays Как определить размер моего массива в C?
- arrays Каков наилучший способ конвертировать массив в хеш в Ruby
- arrays Сравнение двухбайтовых массивов в .NET
- stl Зачем использовать итераторы вместо индексов массива?
- stl Инициализация статического std :: map <int, int> в C ++
- stl К STL или! STL, вот в чем вопрос
- stl Строка c_str () против данных ()
- vector Как получить доступ к последнему значению в векторе?
- vector Объединение двух стандартных: векторов
- vector Как отсортировать std :: vector по значениям другого std :: vector?
- vector Стирание элементов из вектора
- stdvector C ++ valarray против вектора
- stdvector Performance issue for vector::size() in a loop in C++
- stdvector Как преобразовать вектор <unsigned char> в int?