C ++数组具有值语义而没有分配器shenanigans?

时间:2009-11-05 14:22:21

标签: c++ stl boost

我正在寻找一个C ++容器,它是boost :: array,boost :: scoped_array和std :: vector之间的交叉。

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

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

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

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

我不需要调整任何大小,但是大小必须在运行时可控。基本上,scoped_array的一个变体碰巧有一个理智的拷贝构造函数(例如通过std :: copy)就可以了。是否有类似这样的标准集合?

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

2 个答案:

答案 0 :(得分:1)

听起来不难听。有什么事吗?

template <typename T> my_array {
    T* m_ptr;
    size_t m_size;
public:
    my_array(size_t sz)
        : m_ptr(new T[sz])
        , m_size(sz)
    {}
    my_array(const my_array &other)
        : m_ptr(new T[other.m_size])
        , m_size(other.m_size)
    {
        std::copy(other.m_ptr, other.m_ptr + other.m_size, m_ptr);
    }
    ~my_array() {
        delete[] m_ptr;
    }

    // ... operator[], etc.
};

通常的免责声明 - 这是我的头脑,没有编译或任何东西。

答案 1 :(得分:1)

std::vector私下继承,然后进行适当调整。例如,删除resize(),并可能添加setsize()bool标记以确定是否已设置大小。

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