具有自定义内存分配器的 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
我想为函数的参数创建一个模板。
参数是一个带有分配器的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