GOOGLE ADS

вторник, 12 апреля 2022 г.

Принять указатель/итератор в универсальной функции

Мне нужно создать общую функцию, которая будет выделять массив, содержащий те же элементы, что и вектор в основной функции.

Эта общая функция должна принимать указатели/итераторы на начало и конец вектора.

#include <iostream>
#include <new>
#include <vector>
template <typename type>
type *MakeArray(type::iterator start, type::iterator after_end) {
int n = 0;
while (start < after_end) {
start++;
n++;
}
start -= n;
type *arr = nullptr;
arr = new type[n];
throw std::bad_alloc("Not enough memory!");
while (start < after_end) {
*arr = *start;
start++;
arr++;
}
delete[] arr;
arr-=n;
return arr;
}
int main() {
int n=5;
std::vector<double>a{1,2,3,4,5};
double *arr = nullptr;
try {
arr = MakeArray(a.begin(),a.end());
} catch (std::bad_alloc e) {
std::cout << "Exception: " << e.what();
}
delete[] arr;
return 0;
}

ОШИБКИ:

строка 5:

ожидается ')' перед 'after_end'

ожидал ';' перед токеном '{'

строка 30:

отсутствующие аргументы шаблона перед токеном '('

Я не вижу причин, почему я должен получать эти ошибки. Не могли бы вы помочь мне исправить мой код? Итераторы и динамическое размещение для меня новы.


Решение проблемы

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

Кроме того, вы не должны использовать delete[] arr;в своей функции, потому что: (а) в этот момент она больше не указывает на память, выделенную newвызовом; (b) если вы это сделаете, вы не сможете использовать его в вызывающем модуле.

Есть также некоторые другие существенные упрощения и улучшения, которые вы можете внести в свою функцию, которые я показал в приведенном ниже коде:

template <typename it_type>
auto* MakeArray(it_type start, it_type after_end)
{
using basetype = typename std::decay< decltype(*start) >::type; // Type of contained objects
size_t size = static_cast<size_t>(std::distance(start, after_end)); // Quick calculation of size
basetype* arr = new basetype[size]; // This will automatically throw (bad_alloc) if it fails
std::copy(start, after_end, arr); // Quicker/easier way to do the data copy
return arr;
}

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...