std::vector中元素的压入和清除

来源:互联网 发布:mac svn客户端 E220003 编辑:程序博客网 时间:2024/05/05 21:25

结构体:

struct Node{Node(int x):uid(x) { }Node(const Node& n):uid(n.uid) { cout << "Copy node " << uid << endl; }~Node() { cout << "~Node " << uid << endl; }int uid;  // 唯一标识};

有代码:

vector<Node> vec;Node node1(1), node2(2);// insert two nodescout << "nothing pushed" << endl;vec.push_back(node1);cout << "node1 pushed" << endl;vec.push_back(node2);cout << "node2 pushed" << endl;// clear vecvec.clear();cout << "vec cleared" << endl;

代码功能简略说明:定义node1和node2,uid分别为1和2,将两者分别压入vec中,然后执行vec.clear()清除其中元素。

运行输出:

nothing pushed
Copy node 1
node1 pushed
Copy node 1
~Node 1

Copy node 2
node2 pushed
~Node 1
~Node 2

vec cleared
~Node 2
~Node 1

解释:

(1)红色:压入node1时,调用 复制构造函数 初始化node1的副本;

(2)蓝色:在压入node2时,vec的容量不足,开辟新的空间,然后将原来的node1副本拷贝一份到新的空间中(调用 复制构造函数 ),再析构旧的node1副本(调用 析构函数 ),最后压入node2时调用 拷贝构造函数 初始化副本。

(3)绿色:执行vec.clear()操作时,按照压入顺序先后析构vec中的元素。

(4)紫色:程序结束时,析构node1和node2,由于栈帧是后进先出,所以先析构后定义的node2,再析构先定义的node1


2014/11/15

0 0
原创粉丝点击