求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_; } };
实现说明
- 内存特性:编译期通过模板参数
MaxSize确定底层数组大小,内存占用固定为MaxSize * sizeof(size_t) + sizeof(size_t),完全符合编译期可预知的要求。 - 操作兼容性:
push_back、find、erase的行为与std::vector完全一致;contains借助C++20范围库实现,和标准库风格统一。 - 扩展性:可以根据需求轻松添加
pop_back、clear等std::vector的常用接口,无需修改核心内存结构。
如果不需要顺序存储,仅需要固定内存的集合结构,也可以基于std::flat_hash_set搭配自定义固定内存分配器实现,但上述FixedVector是最直接匹配你顺序容器需求的方案。
内容的提问来源于stack exchange,提问作者fuse tee
相关产品推荐
相关产品推荐

