vector 如何在特定位置调用复制构造函数?

Posted

技术标签:

【中文标题】vector 如何在特定位置调用复制构造函数?【英文标题】:How does vector calls copy constructor on specific location? 【发布时间】:2019-05-14 09:26:31 【问题描述】:

我想知道向量在 C++ 中是如何工作的。当我们添加一个新元素并且向量用完空间时,它会分配一个新内存并将所有先前的元素复制到新位置。

现在,如何定义这种行为?

A* a = new A(prev_a);

将在新分配的新位置复制构造。但是对于向量,我们必须分配多个对象。但是我们不能这样做,因为数组 new 不能有初始化参数。

所以我想知道,vector 是如何实现这一点的?我假设向量首先分配内存并在特定位置调用复制构造函数。这是怎么做的?谢谢

【问题讨论】:

您可以查看成员 _M_allocate_and_copy 的 (GCC) 实现:template<typename _ForwardIterator > pointer std::vector::_M_allocate_and_copy ( size_type __n, _ForwardIterator __first, _ForwardIterator __last ) 供参考:en.cppreference.com/w/cpp/memory/allocator_traits/construct 请注意,有一个分配和多个复制构造,而不是分配加复制构造每个元素跨度> 【参考方案1】:

我假设向量先分配内存,然后在特定位置调用复制构造函数。

没错,这是两个独立的步骤:

    内存分配使用allocator::allocate。 初始化。它使用allocator::construct 复制/移动构造元素,这通常使用placement new。

【讨论】:

以上是关于vector 如何在特定位置调用复制构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

2022-04-09 STL容器vector与拷贝构造函数

如何从派生类复制构造函数调用基类复制构造函数? [复制]

如何在 c# 中调用与构造函数不同的构造函数? [复制]

如何从匿名内部类调用特定的父构造函数?

如何在类的成员函数中调用复制构造函数?

如何在 C++ 中调用基类的参数化构造函数?