【问题标题】:Is there some STL "container" for one element on the heap?堆上的一个元素是否有一些 STL“容器”?
【发布时间】:2021-11-15 14:35:30
【问题描述】:

我的问题:

仅包含 STL 容器的类可以使用Rule of Zero,因此不必手动编写析构函数/副本等。

我想知道是否有为最简单的情况设计的 STL 工具(具有上述属性):一个元素(在堆上)?


解释我们什么时候需要这个:

好吧,这个问题更小众/假设:我们有一个对象Foo 有很多成员(n 成员)。 Foo 被移动复制了很多,以至于将其数据存储为单个堆对象是值得的(因此它可以代替n 浅拷贝它可以只做1)。有时也会被深度复制。

我们可以通过使用带有一个元素的vector 来解决这个问题:

class Foo
{
    struct Data
    {
        char gender;
        int age;
        std::string name;
        // lots of data
    };

    std::vector<Data> data;
    
public:

    Foo () : data(1) {}

    void Input (char c, int x, const std::string & str)
    {
        auto & d = data[0];
        
        d.gender = c;
        d.age = x;
        d.name = str;
    }

    void Print () const
    {
        auto & d = data[0];

        std::cout
            << d.gender << std::endl
            << d.age << std::endl
            << d.name << std::endl;
    }
};

demo

为了避免构造函数和所有那些 [0]s 我们可以 wrap the vector into its own class,但这感觉就像一个 hack - vector 是过度杀戮并且可以容纳额外的内存(sizecapacity 如果编译器不会优化)。


请注意,unique_ptrshared_ptr 对此有不同的复制配置文件,因此在这里没有帮助 (example)。此外,这个问题与pimpl 相似但又不完全相同,因为这里我们定义了一个类型(使用pimpl 我们甚至不能使用上面的vector 技术)。

【问题讨论】:

标签: c++ pointers stl containers


【解决方案1】:

您可能正在寻找所谓的深度/克隆/复制/值指针(基本上是具有深度复制功能的唯一指针)。甚至还有一个提案,不知道它的实际状态:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3339.pdf

AFAIK,到目前为止还没有被接受。也许,一些外部库提供了它(Boost?)。

相关问题:Is there a scoped ptr that has deep copy functionality built in? 在其接受的答案中,有一个指向某个库的链接,它应该提供所需的功能。它似乎不再被维护,但也许它仍然可以使用。

您可以谷歌搜索更多解决方案。例如,您可以复制粘贴(并可能查看)此实现:https://vorbrodt.blog/2021/04/05/stddeep_ptr/

相信您也可以在 Code Reivew 网站上找到一些解决方案,例如:DeepPtr: a deep-copying unique_ptr wrapper in C++。我认为使用std::unique_ptr 并使用深拷贝功能包装它是个好主意。

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2023-04-03
    • 2018-04-03
    相关资源
    最近更新 更多