接受泛型函数中的指针/迭代器



我需要制作一个泛型函数,它将分配一个数组,该数组的元素与主函数中的vector相同。

这个通用函数应该接受指向向量开头和结尾的指针/迭代器。

#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;,因为:(a(此时,它不再指向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;
}

相关内容

  • 没有找到相关文章