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

c++ template for std::vector with custom memory allocator

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

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

谢谢。

您不需要为分配器提供默认值。但真正的问题是你正在填充一个局部变量 - 你接受 vec by value!

参考一下,删除不必要的默认值。此外,insert() 的重载完全符合您的要求,无需手动循环(由于重新分配的数量不确定,这不仅冗长而且效率低下):

template <typename T, typename A>
void pad_zero(std::vector<T,A>& vec, uint32_t n) {
//                           ^^^
    vec.insert(vec.end(), n, T{0});
}

您不需要提供分配器,template-argument-deduction 会为您完成。

另外请注意,您正在按值传递向量,因此在 pad_zero 中您会得到向量的 copy,而原始向量保持不变,这可能不是您要找的东西

见下方代码

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