You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

原方法报错原因说明

  1. 直接调用外层vector构造函数报错:vector<vector<unique_ptr<MyClass>>> outer(display_page_count, vector<unique_ptr<MyClass>>(64)) 这种写法会尝试拷贝第二个参数的内层vector,但unique_ptr不可拷贝,导致整个内层vector也不可拷贝,因此编译器提示无匹配构造函数。
  2. push_back内层vector报错:直接push_back(inner)会触发拷贝操作,而unique_ptr的拷贝构造函数被删除,因此报错。改用std::move转移所有权即可解决。

内容的提问来源于stack exchange,提问作者aga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:12:23