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

求C++20中满足固定内存的size_t容器(与固定大小vector不同)

针对固定内存可变元素数容器的解决方案

C++20标准库并没有直接提供完全匹配你需求的容器,但可以基于标准组件快速实现一个符合要求的自定义容器,核心思路是用编译期固定大小的数组作为底层存储,搭配计数器区分已存储元素和最大容量,同时封装你需要的操作。

核心需求匹配点

  • 编译期确定最大容量,内存占用固定且可预知
  • 区分实际存储元素数量与最大容量(避免std::array始终填满元素的问题)
  • 提供与std::vector<size_t>一致的push_back、contains、find、erase操作

自定义容器实现示例

#include <array>
#include <algorithm>
#include <stdexcept>
#include <ranges>

template <size_t MaxSize>
class FixedVector {
private:
    std::array<size_t, MaxSize> data_;
    size_t size_ = 0;

public:
    // 向容器尾部添加元素,满容量时抛出异常
    void push_back(size_t value) {
        if (size_ >= MaxSize) {
            throw std::out_of_range("FixedVector reaches maximum capacity");
        }
        data_[size_++] = value;
    }

    // 检查元素是否存在
    bool contains(size_t value) const {
        return std::ranges::contains(*this, value);
    }

    // 查找元素,返回指向元素的迭代器(不存在则返回end())
    auto find(size_t value) const {
        return std::find(data_.begin(), data_.begin() + size_, value);
    }

    // 按迭代器删除元素,返回指向被删除元素下一个位置的迭代器
    auto erase(auto it) {
        if (it < data_.begin() || it >= data_.begin() + size_) {
            throw std::invalid_argument("Iterator out of valid range");
        }
        std::move(it + 1, data_.begin() + size_, it);
        --size_;
        return it;
    }

    // 基础状态查询接口
    size_t size() const { return size_; }
    constexpr size_t max_size() const { return MaxSize; }
    bool empty() const { return size_ == 0; }

    // 迭代器支持,兼容标准库算法
    auto begin() noexcept { return data_.begin(); }
    auto end() noexcept { return data_.begin() + size_; }
    auto begin() const noexcept { return data_.begin(); }
    auto end() const noexcept { return data_.begin() + size_; }
};

实现说明

  1. 内存特性:编译期通过模板参数MaxSize确定底层数组大小,内存占用固定为MaxSize * sizeof(size_t) + sizeof(size_t),完全符合编译期可预知的要求。
  2. 操作兼容性:push_back、find、erase的行为与std::vector完全一致;contains借助C++20范围库实现,和标准库风格统一。
  3. 扩展性:可以根据需求轻松添加pop_back、clear等std::vector的常用接口,无需修改核心内存结构。

如果不需要顺序存储,仅需要固定内存的集合结构,也可以基于std::flat_hash_set搭配自定义固定内存分配器实现,但上述FixedVector是最直接匹配你顺序容器需求的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:37:00