微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – STL容器如何复制对象?

我知道STL容器,如矢量复制对象添加时. push_back方法看起来像:
void push_back ( const T& x );

我很惊讶地看到它将该项目作为参考.我写了一个示例程序来看看它是如何工作的.

struct Foo
{
    Foo()
    {
        std::cout << "Inside Foo constructor" << std::endl;
    }

    Foo(const Foo& f)
    {
        std::cout << "inside copy constructor" << std::endl;
    }
};

Foo f;
std::vector<Foo> foos;
foos.push_back(f);

这将复制对象,我可以看到它正在调用copy-constructor.

我的问题是,当push_back将项目作为引用时,如何调用copy-constructor?还是我在这里遗漏的东西?

有什么想法吗..?

解决方法

它可能使用“placement new”来在其内部数组中原位构造对象.放置新的不分配任何内存;它只是将对象放在你指定的位置,并调用构造函数.语法是new(address)Class(constructor_arguments).

调用复制构造函数T :: T(T const&)来就地创建副本.这样的东西(简化):

template<T>
void vector<T>::push_back(T const &item) {
    // resize if necessary
    new (&d_array[d_size++]) T(item);
}

请注意,T必须有一个复制构造函数才能工作.认情况下(如果你什么都不做),它会免费获得一个.如果你明确定义它,它必须是公开的,用于向量< T>上班.

Here’s how GNU’s libstdc++ does it,但我怀疑这将是非常有启发性的.有一个分配器(向量的第二个模板参数)使其不那么简单.

原文地址:https://www.jb51.cc/c/112286.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐