是否存在支持零法则、存储单个堆上元素的STL容器工具?
问题答案
截至C++23标准,标准库中并没有专门为单堆元素值语义场景设计的原生工具,你可以根据实际需求选择以下方案:
- 继续使用单元素
std::vector实现
这是目前生产环境中最常见的替代方案,无需额外编码就能满足零规则要求,同时绝大多数主流编译器都会对固定大小的单元素vector做优化,多余的size、capacity字段带来的开销几乎可以忽略,唯一的不便是访问元素需要加[0]下标。 - 自定义轻量
value_ptr实现
如果你在意vector的额外内存开销,也可以自行实现一个值语义的智能指针,仅占用一个指针的内存空间,同时完全符合零规则要求,参考实现如下:
代入你提供的#include <memory> #include <utility> template<typename T> class value_ptr { T* ptr = nullptr; public: value_ptr() : ptr(new T()) {} // 支持自定义构造参数 template<typename... Args> value_ptr(Args&&... args) : ptr(new T(std::forward<Args>(args)...)) {} // 拷贝逻辑:深拷贝 value_ptr(const value_ptr& other) : ptr(new T(*other.ptr)) {} value_ptr& operator=(const value_ptr& other) { if (this != &other) { delete ptr; ptr = new T(*other.ptr); } return *this; } // 移动逻辑:转移指针,零成本 value_ptr(value_ptr&& other) noexcept : ptr(std::exchange(other.ptr, nullptr)) {} value_ptr& operator=(value_ptr&& other) noexcept { std::swap(ptr, other.ptr); return *this; } ~value_ptr() { delete ptr; } // 元素访问接口 T& operator*() { return *ptr; } const T& operator*() const { return *ptr; } T* operator->() { return ptr; } const T* operator->() const { return ptr; } };Foo类场景,使用方式如下:#include <iostream> #include <string> class Foo { struct Data { char gender; int age; std::string name; // lots of data }; value_ptr<Data> data; public: // 无需手动定义构造/析构/拷贝/移动函数,符合零规则 void Input (char c, int x, const std::string & str) { data->gender = c; data->age = x; data->name = str; } void Print () const { std::cout << data->gender << std::endl << data->age << std::endl << data->name << std::endl; } }; - 使用第三方现成实现
如果你不想自行维护value_ptr代码,可以直接使用Boost库提供的boost::value_ptr,功能更完善,边界情况处理也更周全。
另外针对标准支持进度,目前C++26的相关提案已经在讨论加入标准std::value_ptr,正是为了覆盖这类单堆元素值语义的需求。
内容的提问来源于stack exchange,提问作者Elliott
相关产品推荐
相关产品推荐

