LINUX.ORG.RU

Как принято работать с сишными массивами в С++?


0

0

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

Как это принято делать в С++? Перенести данные из исходного массива в vector? Или создать свой примитивный auto_ptr для массивов и скопировать память memcpy? Если вектор, то насколько это будет медленее? В массиве лежат структуры.

anonymous

> Как это принято делать в С++? Перенести данные из исходного массива в vector?

можно. У vector есть конструктор от двух итераторов begin и end, он копирует тогда оттуда. А обычные указатели могут выступать итераторами.

dilmah ★★★★★
()

Если копировать данные необязательно (т.е. можно разрушающие действия проводить прямо над областью памяти, которую выдаёт внешний код), то можно завернуть указатель в boost::shared_array. Там можно указать свою функцию-deleter.

Deleted
()
Ответ на: комментарий от Deleted

Нет, копировать как раз надо. Иначе я бы просто qsort использовал, т.к. за управление памятью исходного массива отвечает код, откуда он приходит.

anonymous
()
Ответ на: комментарий от dilmah

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

anonymous
()
Ответ на: комментарий от Reset

Отсортировать сишный массив можно и qsort'ом. Нужно именно копию создать с автоматическим управлением памятью.

anonymous
()
Ответ на: комментарий от anonymous

> Интересно, а как в этом случае осуществляется копирование? Копируется сразу блок памяти или поэлементно?

C++ сильно полагается на то что простые вещи там инлайнятся и далее оптимизируются компилятором. В конструкторе вектора делается std::copy -- сам std::copy это инлайновая шаблонная функция которая делает цикл поэлементного копирования. Но никто не мешает компилятору превратить такой цикл в вызов memcpy.

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.