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

时间:2014-11-11 17:15:49

标签: 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;
 } 

为什么这三行:

   m.erase(m.begin());
   m.erase(m.begin());
   m.erase(m.begin());

导致此输出:

   Destructing Simple 3
   Destructing Simple 3
   Destructing Simple 3

为什么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

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

擦除第一个元素时,只会销毁一个元素(最后一个元素)。其他元素从前到后分配:

Initial state:     1, 2, 3
State after copy:  2, 3, 3
State after erase: 2, 3
State after copy:  3, 3
State after erase: 3
Final state:       [empty]

3永远是最后一个。

答案 2 :(得分:1)

将您的复制构造器设为

Simple(const Simple& other) { 
     std::cout << "Copy from "<< other.m_nID << std::endl;
     m_nID = other.m_nID;
    };

并且您将看到在将事物推入向量释放和重新完成时如何发生,从而导致复制和破坏。

同样,也要定义assignemnt运算符:

Simple& operator=(const Simple& other)
{ 
    std::cout << "assign from " << other.m_nID << " to " << m_nID << std::endl;
    m_nID = other.m_nID;
    return *this;
}

答案 3 :(得分:0)

当我运行它时,我得到(在将不存在的m.mVector的引用修复为m之后)

Destructing Simple 1
Destructing Simple 1
Destructing Simple 2
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 2
Destructing Simple 1
在我看来,这似乎是在证明推进矢量分流很多东西

编辑 - 在复制构造函数中添加了跟踪

Constructing Simple 1
Constructing Simple 2
Constructing Simple 1
Destructing Simple 1
Constructing Simple 3
Constructing Simple 1
Constructing Simple 2
Destructing Simple 1
Destructing Simple 2
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 2
Destructing Simple 1
有趣的是,他们不平衡。我现在对此感到惊讶 - 尤其是在Mike Seymour指出最后3行是原始堆栈版本被销毁之后