在从矢量中删除时,成员会发生什么?

mac*_*ekm 2 c++ vector

下面是代码,让我感到困惑:

class Simple{

  private:
    int m_nID;

  public:
    Simple(int nID) {
     m_nID = nID;
    }

   ~Simple() {
     std::cout << "Destructing Simple " <<  m_nID << std::endl;
    }

    Simple(const Simple& other) { 
     m_nID = other.m_nID;
    };  
 };

 int main(){
    Simple Simple1(1); // allocating on stack
    Simple Simple2(2); //
    Simple Simple3(3); //
    std::vector<Simple>  m;

    m.push_back(Simple1);  //
    m.push_back(Simple2);  // copy constructor called
    m.push_back(Simple3);  //
    std::cout << "\n------ ERASING ELEMENTs FROM VECTOR-------" << std::endl;
    m.erase(m.begin()); //
    m.erase(m.begin()); // destructor called
    m.erase(m.begin()); //
    std::cout << "\n------ After ERASING ELEMENT FROM VECTOR-------" << std::endl;
    return 0;
 } 
Run Code Online (Sandbox Code Playgroud)

为什么这三行:

   m.erase(m.begin());
   m.erase(m.begin());
   m.erase(m.begin());
Run Code Online (Sandbox Code Playgroud)

导致此输出:

   Destructing Simple 3
   Destructing Simple 3
   Destructing Simple 3
Run Code Online (Sandbox Code Playgroud)

为什么m_nID总是3?对于每个push_back复制构造函数,将1,2,3复制到m_nID,因此不应该是:

    Destructing Simple 1  // or 3
    Destructing Simple 2  // or 2
    Destructing Simple 3  // or 1
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 7

如何std::vector删除第一个元素?它将所有元素复制下来(使用赋值),然后破坏最后一个元素.尝试检测复制构造函数和赋值,你会看到发生了什么.(push_back如果向量必须增加其容量,您在执行此操作时也可能会看到一些意外的副本.)