vector.insert(...)是否会调用构造函数或赋值运算符?

时间:2011-10-21 21:37:27

标签: c++ vector constructor

我有一个包含class A类型元素的向量。类A具有明确定义的复制构造函数,但复制运算符已设为私有且未定义(不打算使用)。如果我将新元素插入到矢量中,如下所示

A walker;                      //This calls the default constructor.
std::vector< A > vec;
std::vector< A >::iterator it = vec.begin();
vec.insert( it, walker );      //Shouldn't this call the copy constructor?

我收到错误,抱怨复制操作符是私有的。但是不应该使用复制构造函数吗?

2 个答案:

答案 0 :(得分:4)

vector确实使用了插入元素的复制构造函数。但是vector仍然需要内部的赋值运算符,在vector类型的可重新赋值范围内是可分配的。我相信C ++ 11现在只需要移动赋值。

答案 1 :(得分:0)

在 msvc 或 gcc 中,Vector.insert() 在内部调用 emplace() 函数。

首先,如果向量的容量与向量的大小相等,则以两倍的容量重新分配向量。首先插入/移动对象(调用移动构造函数),然后在新分配的位置复制现有对象存储(复制构造函数被调用)。

如果在插入调用之前vector的容量大于size,现在如果最后没有完成插入,首先插入/移动对象(调用移动构造函数)并且现有的对象只是在同一个存储中分配(赋值复制被称为运算符)

#include <iostream>
#include<vector>
using namespace std;

class A
{
public:
    int i;
    A() = default;
    A(int k) :i(k) { cout << "init"; };
    A(const A&&)
    {
        {cout << "move"; };
    }
    A(const A&)
    {
        {cout << "copy"; };
    }
    A& operator=(const A&)
    {
        std::cout << endl << "assignment" << endl;
        return *this;
    }
   
};




int main()
{
    // vector<int> vi(5);  // just to show that std::vector always default initializes values & hence int will be 0 here

  // A a(2);
   // A a= 2;

    vector<A> va(4); // ---> calls default
    cout << "------" << va.capacity() << "-";
  

  va.emplace_back(2); 
 

  
    cout << "------"<<va.capacity()<<"-"<<va.size()<<"--";
    va.push_back(2);
    
    va.insert(va.begin(), 4);

    return 0;
}

------2- init 移动复制 复制 ------4-3-- 启动 分配

分配 移动 分配