我想为函数的参数创建一个模板。
参数是带有分配器的std::vector<type>
。
默认情况下使用默认内存分配器,但也可以使用自定义分配器。
以下代码不起作用。如何解决这个问题?
template <typename T, typename T2=std::allocator<T>>
void pad_zero(std::vector<T,T2> vec, uint32_t n){
uint32_t i;
for (i = 0; i < n; i++){
vec.push_back(0);
}
}
感谢。
答案 0 :(得分:4)
您无需为分配器提供默认值。但问题实际上是你填充了一个局部变量 - 你接受{em>值的vec
!
通过引用获取它,并删除不必要的默认值。此外,insert()
的重载完全符合您的要求,无需手动循环(由于重新分配的数量不确定,不仅冗长而且效率低下):
template <typename T, typename A>
void pad_zero(std::vector<T,A>& vec, uint32_t n) {
// ^^^
vec.insert(vec.end(), n, T{0});
}
答案 1 :(得分:2)
您不需要提供分配器,template-argument-deduction将为您执行此操作。
另外请注意,你是按值传递矢量,所以在pad_zero
内你得到了矢量的副本,而原始的那个保持不变,这可能不是你的正在寻找
见下面的代码
http://coliru.stacked-crooked.com/a/5457167a4aeb36db
#include <iostream>
#include <vector>
template <typename T, typename A>
void pad_zero(std::vector<T,A>& vec, uint32_t n)
{
uint32_t i;
for (i = 0; i < n; i++)
{
vec.push_back(0);
}
}
int main()
{
std::vector<int> a = { 1, 2, 3 };
pad_zero(a, 10);
for (int i : a)
std::cout << i << '\n';
}
<强>输出:强>
1 2 3 0 0 0 0 0 0 0 0 0 0