Приведите char * к std :: vector - PullRequest
4 голосов
/ 01 октября 2011

Существует ли быстрый (процессорный) способ приведения массива char в std::vector<char>?

Моя функция выглядит следующим образом:

void someFunction(char* data, int size)
{
    // Now here I need to make the std::vector<char>
    // using the data and size.
}

Ответы [ 2 ]

15 голосов
/ 01 октября 2011

Вы не можете ничего «разыграть» здесь, но вы можете легко построить вектор из строки C:

std::vector<char> v(data, data + size);

Это создаст копию, хотя.

7 голосов
/ 01 октября 2011

Общее правило для контейнеров 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);
...