c++ - 接受非标准可构造和不可分配类型的 vector 的替换

标签 c++ vector containers

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

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

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

    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类提供了一个赋值运算符,但这个运算符的工作方式类似于对引用的赋值。

最佳答案

编辑:以下不再是好的做法。如果您的对象支持移动,那么它可能适合一个 vector (有关详细信息,请参阅 std::vector elements requirements,尤其是针对 C++17 的更改)。

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

关于c++ - 接受非标准可构造和不可分配类型的 vector 的替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913337/

相关文章:

c++运行并发for循环,甚至可能吗?

C++ 按值删除 vector 元素

html - 主 slider 调整大小以适应行容器

C++字符串库错误: string subscript out of range

r - 将向量如 c ("x","y","z") 转换为 function(x , y, z){}

c++ - 为什么编译器会在模板函数上产生错误

docker - 为什么 Kubernetes 源代码比其他容器编排器大一个数量级?

c++ - vector push_back 不起作用

c++ - 在 C++ 的 Winsock 中发送 HTTP GET 请求后,Recv() 函数挂起

c++ - Clang 候选模板被忽略 : substitution failure (also fails to compile with gcc, VC 工作正常)