C++ std::vector与带有自定义分配器的std::vector

C++ std::vector与带有自定义分配器的std::vector,c++,C++,我正在使用我自己的分配器处理一个向量,该向量具有快速运行时要求,以避免调用new/delete。现在的问题是这样的代码没有编译: std::vector<char> x(1000); std::vector<char,myalloc<char>> y(1000); x = y; std::向量x(1000); std::向量y(1000); x=y; 这显然是因为std::vector的分配器是在编译时实现的,并且会更改类型。但是像上面这样的代码应该是独立

我正在使用我自己的分配器处理一个向量,该向量具有快速运行时要求,以避免调用new/delete。现在的问题是这样的代码没有编译:

std::vector<char> x(1000);
std::vector<char,myalloc<char>> y(1000);
x = y;
std::向量x(1000);
std::向量y(1000);
x=y;
这显然是因为std::vector的分配器是在编译时实现的,并且会更改类型。但是像上面这样的代码应该是独立于分配器的

对于POD,我当然可以做memcpy,但还有其他方法吗?我已经接近实现我自己的向量了,它将使用一个在运行时动态指定的自定义分配器,并去掉std::vector

但是像上面这样的代码应该是独立于分配器的

分配元素实际上应该是独立于分配器的。但是std::vector的作用不仅仅是分配元素,它还负责分配程序。因此,它不应该是独立于分配器的

std::vector
只为分配元素提供了一个接口:成员函数。它可以这样使用:

x.assign(y.begin(), y.end());

自从C++ 17,允许分配器知道容器有类型删除的分配器支持,所以你可以始终使用<代码> STD::PMR::vector < /C> >,但是它有一些问题需要考虑——类型开销、不同的分配器传播语义、不同的接口等。 但是像上面这样的代码应该是独立于分配器的

分配元素实际上应该是独立于分配器的。但是std::vector的作用不仅仅是分配元素,它还负责分配程序。因此,它不应该是独立于分配器的

std::vector
只为分配元素提供了一个接口:成员函数。它可以这样使用:

x.assign(y.begin(), y.end());

自从C++ 17,允许分配器知道容器有类型删除的分配器支持,所以你可以始终使用<代码> STD::PMR:向量< /代码>,但是它有一些需要考虑的问题——类型删除开销、不同的分配器传播语义、不同的接口等等。jtband是的,但这需要在代码中进行大量编辑。

x.assign(y.begin(),y.end())
或(C++11)
x.assign(std::begin(y),std::end(y))
应该这样做。一个向量的
操作符=()
没有重载,不管你认为“应该”是什么情况。如果您真的想要一个这样工作的类型,请创建一个简单的
结构
/
类型(如果需要,可以使用模板),该类型包含一个向量(使用任何元素类型和分配器),并确保其
运算符=()
按要求工作。如果我没记错的话,你可以使用
std::pmr::vector
而不是
std::vector
任何地方都应该“正常工作”。你能使用assign吗@jtband是的,但这需要在代码中进行大量编辑。
x.assign(y.begin(),y.end())
或(C++11)
x.assign(std::begin(y),std::end(y))
应该这样做。一个向量的
操作符=()
没有重载,不管你认为“应该”是什么情况。如果您真的想要一个这样工作的类型,请创建一个简单的
结构
/
类型(如果需要,可以使用模板),该类型包含一个向量(使用任何元素类型和分配器),并确保其
运算符=()
按要求工作。如果我没记错的话,你可以使用
std::pmr::vector
而不是
std::vector
到处都可以,一切都应该“正常工作”。回答得很简洁。我只想添加
begin()
end()
也可以在构造函数中使用,比如
std::vector y(x.begin(),x.end())@nada是的。事实上,它们可以在任何上下文中使用,其中需要一对迭代器表示的范围是一个很好的简洁答案。我只想添加
begin()
end()
也可以在构造函数中使用,比如
std::vector y(x.begin(),x.end())@nada是的。事实上,它们可以在需要一对迭代器表示的范围的任何上下文中使用