带有自定义内存分配器的std :: vector的c ++模板

时间:2016-07-20 19:51:36

标签: c++ templates stdvector

我想为函数的参数创建一个模板。

参数是带有分配器的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);
    }
}

感谢。

2 个答案:

答案 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