Общее правило для контейнеров STL состоит в том, что они делают копии своего содержимого.В C ++ 11 есть специальные способы перемещения элементов в контейнер (например, функция-член emplace_back()
из std::vector
), но в вашем примере элементы являются char
объектамиТаким образом, вы все равно собираетесь скопировать каждый из size
char
объектов.
Думайте о std::vector
как обёртке указателя на массив вместе с длиной массива.Ближайшим эквивалентом «приведения char *
к std::vector<char>
» является замена указателя и длины вектора на заданный указатель и длину, однако указывается длина (две возможности - указатель на один элемент после конца илиsize_t
значение).Не существует стандартной функции-члена std::vector
, которую вы могли бы использовать для обмена внутренними данными с указанным указателем и длиной.
Однако это не зря.std::vector
реализует семантику владения для каждого элемента, который он содержит.Его базовый массив выделяется с помощью some allocator (второй параметр шаблона), который по умолчанию равен std::allocator
.Если бы вам было разрешено поменять местами внутренние элементы, вам нужно было бы убедиться, что использовался тот же набор процедур выделения кучи.Кроме того, ваша реализация STL должна будет исправить метод хранения «длины» вектора, а не оставлять эту деталь не уточненной.В мире ООП обычно указывается больше деталей, чем необходимо, потому что это может привести к более высокой связи.
Но предположим, что такая функция-член существует для вашей реализации STL.В вашем примере вы просто не знаете, как было выделено data
, поэтому вы могли случайно указать std::vector
указатель на кучную память, которая не была выделена ожидаемым распределителем.Например, data
можно было бы выделить с помощью malloc
, тогда как вектор мог бы освободить память с помощью delete
.Использование несовпадающих процедур распределения и освобождения приводит к неопределенному поведению.Возможно, вы потребуете, чтобы someFunction()
принимал только данные, выделенные с помощью определенной процедуры выделения, но это снова указывает больше деталей, чем необходимо.
Надеюсь, я доказал, что функция-член std::vector
, которая заменяетВнутренние данные членов не очень хорошая идея.Если вам действительно нужны std::vector<char>
из data
и size
, вы должны сконструировать их с:
std::vector<char> vec(data, data + size);