Преобразование типа вектора из uint8 в uint16

193
02 июля 2022, 21:40

Есть вектор std::vector<uint8_t> From;
Он содержит 10^9 элементов

И есть пустой вектор std::vector<uint16_t> To;
В который нужно перенести значения так, чтобы значения элементов остались прежними.

Как грамотно это сделать?

Answer 1
To.assign(From.begin(), From.end());

Да, это просто копирование. Хороший компилятор вычислит размер вектора From, выделит память и скопирует данные.

Сколько понадобится памяти? Давайте обозначим объём вектора To за единицу. Тогда объём вектора From будет в два раза больше - две единицы. Так как мы копируем, то на время копирования нам понадобятся три единицы памяти.

Можно ли преобразовать To во From в меньшей памяти? Нет, так как мы хотим чтобы From был вектором.

Вектор умеет распределять память только одним способом - запрашивая непрерывный блок памяти из кучи. Этот блок в момент запроса не может содержать данные - технологии типа realloc не используются вектором (почему - отдельный интересный вопрос). Так как данных в этом блоке нет, значит они где-то ещё и занимают одну единицу памяти. То есть в момент распределения памяти для вектора нам нужны три единицы памяти: одна для данных, две для нового вектора.

И общий рецепт - если памяти мало, не используйте вектора. Непрерывный блок памяти сравнимый с размерами памяти - зло.

READ ALSO
Помогите решить проблему с кодом на Arduino

Помогите решить проблему с кодом на Arduino

Прошу, помогите найти код в ошибке и решить проблему, а то моя тупая головушка не может понять конкретного местаПрошу, не судите строго, я новичок...

201
Как присвоить unsigned char const * к void*?

Как присвоить unsigned char const * к void*?

У меня не много опыта с С++, но вот, что мне нужно сделатьУ меня есть метод который должен скастить unsigned char const * к void*

211
Выбор между std::generate() и std::for_each()

Выбор между std::generate() и std::for_each()

Помогите выбрать реализацию метода из двух вариантов - calc1() и calc2():

134