替换向量接受非标准可构造和不可分配类型

时间:2009-12-16 09:14:15

标签: c++ vector containers

我有一个类test,由于某些原因,它不是标准的可构造的,也不是可分配的。然而,它是可复制的 - 可能会说它的行为有点像参考。

不幸的是,我需要这些元素的动态数组,并意识到vector<test>不是正确的选择,因为向量的元素必须是标准的可构造和可分配的。幸运的是我通过

解决了这个问题
  • 使用vector<T>::reservevector<T>::push_back代替vector<T>::resize并直接填写条目(无标准构造)
  • 用于赋值的copy'nwap技巧以及vector通常使用Pimpl-idiom(不直接赋值现有test元素)实现的事实,即< / p>

    class base {
    private:
        std::vector<test> vect;
        /* ... */
    public:
        /* ... */
        base& operator= (base y) {
            swap(y);
            return *this;
        }
        void swap(base& y) {
            using std::swap;
            swap(vect, y.vect);
        }
       /* ... */
    };
    

现在我假设我可能没有考虑过每一点点,而且最重要的是这些技巧都是强烈依赖于实现的。该标准仅保证标准可构造和可分配类型的标准行为。

现在下一步是什么?如何获得动态数组的test个对象?

备注:我必须更喜欢标准C ++提供的内置解决方案和类。

编辑:我刚才意识到我的伎俩实际上没有用。如果我定义一个真正的*非可赋值类,我的编译器会出现大量错误。所以问题浓缩到最后一个问题:我如何拥有这些test对象的动态数组?

(*)我的test类提供了一个赋值运算符,但是这个运算符类似于对引用的赋值。

4 个答案:

答案 0 :(得分:3)

考虑使用Boost的ptr_vector,它是Boost指针容器库的一部分。请参阅该库motivation中的优势#3。

答案 1 :(得分:0)

编写自己的动态数组类。听起来比试图使STL与那种奇怪的类型一起工作更少的工作。

答案 2 :(得分:0)

您可能希望查看Boost.Intrusive - 尽管这意味着您需要更改test的类型以及内存中放置test实例的位置。

答案 3 :(得分:0)

如何使用指针向量?