具有值语义且没有分配器恶作剧的 C++ 数组?

标签 c++ stl boost

我正在寻找一个介于 boost::array、boost::scoped_array 和 std::vector 之间的 C++ 容器。

我想要一个通过 new[] 动态分配的数组(无自定义分配器),包含在具有有意义的复制构造函数的类型中。

boost::array 是固定大小的,虽然我不需要调整任何东西的大小,但我不知道编译时数组的大小。

boost::scoped_array 没有复制构造函数,这意味着我需要使用 std::copy(我之前的复制粘贴密集型解决方案)手动向每个类添加一个复制构造函数。这也很容易出错,因为您最好确保在添加字段时将正确的初始值设定项添加到自定义复制构造函数;即大量样板文件。

std::vector 使用一些预分配系统,因此不使用 operator new[]。这是有问题的,因为它需要自定义分配器,更糟糕的是,这还不够,因为有一些奇怪的极端情况(我不完全理解),其中涉及按值返回语义导致问题;我不希望容器做任何花哨的事情,而只是包含一个 new[]'d 数组并将其复制到它的复制构造函数中 - 最好重载所有常见的可疑对象以用作集合。

我不需要调整任何东西的大小,但大小必须在运行时是可控的。基本上,恰好具有健全的复制构造函数(例如通过 std::copy)的 scoped_array 变体就可以了。有这样的标准集合吗?

基本上,我正在寻找具有值语义的沼泽标准动态分配数组。

最佳答案

std::vector 私有(private)继承,然后适当调整。例如删除 resize(),并可能添加 setsize() 和一个 bool 标志以确定是否已设置大小。

您的复制构造函数可以调用 std::vector 复制构造函数,并自动设置标志以防止进一步更改。

关于具有值语义且没有分配器恶作剧的 C++ 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1680880/

相关文章:

c++ - bloom_filter_prl.exe : 0xC00000FD: Stack overflow 中 0x013f3277 的未处理异常

c++ - 向双端队列指针发出设置值

c++ - 如何使用 STL::map 作为二维数组

c++ - boost T_CONTLINE token 不起作用

c++ - 从返回 Boost 可选的函数返回右值引用

c++ - 既然我有 msys2,我可以删除之前在 mingw 上安装的实例吗?

c++ - 我应该使用哪个数据库来存储记录,我应该如何使用它?

c++ - 双端队列的迭代器错误

C++:如何将派生类的容器传递给需要其基类容器的函数?

c++ - CMakeLists 不会包含 Boost header