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

C++中const属性(std::vector)的延迟初始化实现方案咨询

实现C++中std::vector属性的延迟初始化且不可修改

最简洁的实现方式可以借助C++17引入的std::optional,结合const引用返回,既保证延迟初始化,又能限制后续修改。以下是示例代码:

#include <vector>
#include <optional>

class MyClass {
private:
    std::optional<std::vector<int>> data_; // 用optional标记是否已初始化

    // 自定义初始化逻辑,可按需修改
    std::vector<int> initData() const {
        return {1, 2, 3, 4};
    }

public:
    // get方法:首次调用时完成初始化,之后返回不可修改的引用
    const std::vector<int>& getData() {
        if (!data_) {
            data_ = initData();
        }
        return *data_;
    }
};

如果需要兼容C++17之前的版本,可以用普通vector加布尔标记的方案:

#include <vector>

class MyClass {
private:
    std::vector<int> data_;
    bool isInitialized_ = false;

    std::vector<int> initData() const {
        return {1, 2, 3, 4};
    }

public:
    const std::vector<int>& getData() {
        if (!isInitialized_) {
            data_ = initData();
            isInitialized_ = true;
        }
        return data_;
    }
};

两种方案的核心逻辑一致:

  • 内部维护可修改的存储对象(或optional包装的对象)
  • 通过get方法控制初始化时机,仅在首次调用时执行初始化逻辑
  • get方法返回const引用,确保外部无法修改已初始化的vector

如果需要线程安全的实现,可以搭配std::call_once避免多线程下重复初始化:

#include <vector>
#include <mutex>

class MyClass {
private:
    std::vector<int> data_;
    std::once_flag initFlag_;

    void initData() {
        data_ = {1, 2, 3, 4};
    }

public:
    const std::vector<int>& getData() {
        std::call_once(initFlag_, &MyClass::initData, this);
        return data_;
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:14:53