使用移动插入和复制插入调整 std::vector 的大小
Resizing a std::vector using move insertion and copy insertion
在 C++ 标准中 vector.capacity section, it defines two overloads for resize()
. (see also https://en.cppreference.com/w/cpp/container/vector/resize)
此重载要求类型 T 为 MoveInsertable
且 DefaultInsertable
:
constexpr void resize(size_type sz);
另一个重载要求类型 T 是 CopyInsertable
:
constexpr void resize(size_type sz, const T& c);
我的问题是,为什么第二个重载不尝试从旧向量的现有值 移动 ,并进一步从提供的 c
参数。那不是更有效率吗?
我同意第二个参数可以是一个右值引用——当它随后从第一个新附加的项目中复制时,这会保存一个副本。我假设你的想法是这样的:
std::vector<LargeObject> v;
// ...
LargeObject obj = setupLotsOfResources();
// Now do 1 move and 9 copies instead of 10 copies
v.resize(10, std::move(obj));
但是,我认为这是一种边缘情况,使用用于 1 个移动构造和 N-1 个副本的右值引用非常令人困惑 API。由于您可以自由使用 std::vector
API 和已经存在的内容,因此对于上面的示例,您将拥有 1 次移动和 N-1 次复制,我相信现有函数签名背后的基本原理是易于使用和简单明了的签名,不需要大量研究规范就可以理解它的作用。
在 C++ 标准中 vector.capacity section, it defines two overloads for resize()
. (see also https://en.cppreference.com/w/cpp/container/vector/resize)
此重载要求类型 T 为 MoveInsertable
且 DefaultInsertable
:
constexpr void resize(size_type sz);
另一个重载要求类型 T 是 CopyInsertable
:
constexpr void resize(size_type sz, const T& c);
我的问题是,为什么第二个重载不尝试从旧向量的现有值 移动 ,并进一步从提供的 c
参数。那不是更有效率吗?
我同意第二个参数可以是一个右值引用——当它随后从第一个新附加的项目中复制时,这会保存一个副本。我假设你的想法是这样的:
std::vector<LargeObject> v;
// ...
LargeObject obj = setupLotsOfResources();
// Now do 1 move and 9 copies instead of 10 copies
v.resize(10, std::move(obj));
但是,我认为这是一种边缘情况,使用用于 1 个移动构造和 N-1 个副本的右值引用非常令人困惑 API。由于您可以自由使用 std::vector
API 和已经存在的内容,因此对于上面的示例,您将拥有 1 次移动和 N-1 次复制,我相信现有函数签名背后的基本原理是易于使用和简单明了的签名,不需要大量研究规范就可以理解它的作用。