如何在C++14中初始化含nullptr的vector<vector<unique_ptr<MyClass>>>
解决运行时创建嵌套unique_ptr vector的问题
方法一:使用emplace_back直接构造内层vector
emplace_back可以直接在外层vector的内存空间中构造内层vector,完全避免拷贝操作,适配unique_ptr不可拷贝的特性。内层vector的构造函数接收数量参数时,会默认构造对应数量的unique_ptr(默认值即为nullptr),正好满足需求:
#include <vector> #include <memory> class MyClass {}; int main() { int display_page_count = 5; // 示例非常量值 std::vector<std::vector<std::unique_ptr<MyClass>>> outer; outer.reserve(display_page_count); // 预分配空间优化性能 for (int i = 0; i < display_page_count; ++i) { // 直接在外层vector中构造包含64个nullptr的内层vector outer.emplace_back(64); } return 0; }
方法二:先扩容外层vector,再初始化每个内层vector
先通过resize设置外层vector的元素数量,再逐个调整内层vector的大小,利用默认构造生成nullptr的unique_ptr:
#include <vector> #include <memory> class MyClass {}; int main() { int display_page_count = 5; std::vector<std::vector<std::unique_ptr<MyClass>>> outer; outer.resize(display_page_count); // 外层先扩容到指定数量,每个元素为空的内层vector for (auto& inner_vec : outer) { inner_vec.resize(64); // 内层vector扩容到64,元素为默认构造的unique_ptr(nullptr) } return 0; }
方法三:移动语义传递内层vector
如果需要先单独构造内层vector,可通过std::move将其所有权转移到外层vector中,避免拷贝:
#include <vector> #include <memory> #include <utility> class MyClass {}; int main() { int display_page_count = 5; std::vector<std::vector<std::unique_ptr<MyClass>>> outer; outer.reserve(display_page_count); for (int i = 0; i < display_page_count; ++i) { std::vector<std::unique_ptr<MyClass>> inner(64); // 移动inner到外层,而非拷贝 outer.push_back(std::move(inner)); } return 0; }
原方法报错原因说明
- 直接调用外层vector构造函数报错:
vector<vector<unique_ptr<MyClass>>> outer(display_page_count, vector<unique_ptr<MyClass>>(64))这种写法会尝试拷贝第二个参数的内层vector,但unique_ptr不可拷贝,导致整个内层vector也不可拷贝,因此编译器提示无匹配构造函数。 - push_back内层vector报错:直接
push_back(inner)会触发拷贝操作,而unique_ptr的拷贝构造函数被删除,因此报错。改用std::move转移所有权即可解决。
内容的提问来源于stack exchange,提问作者aga
相关产品推荐
相关产品推荐

