[C++]vector 的 push_back实现原理

来源:互联网 发布:合肥软件开发 编辑:程序博客网 时间:2024/06/08 16:03

vector 的 push_back实现原理

原理:

vector有预存的内存(capacity),如果存入的元素大于了capacity,就重新分配一个比原来capacity大两倍的内存。

代码示例:

////  main.cpp//  test////  Created by 颜泽鑫 on 4/12/16.//  Copyright © 2016 颜泽鑫. All rights reserved.//#include <iostream>#include <vector>using namespace std;class test {public:    string a;    test(string b) : a(b) {        cout << "new" << " " << a << endl;    }    ~test() {        cout << "deleted " << a << endl;    }};int main(int argc, const char * argv[]) {    vector<test> array;    string a = "A";    array.push_back(test("a"));    cout << array.capacity() << endl;    array.push_back(test("b"));    cout << array.capacity() << endl;    array.push_back(test("c"));    cout << array.capacity() << endl;    array.push_back(test("d"));    cout << array.capacity() << endl;    array.push_back(test("f"));    cout << array.capacity() << endl;    return 0;}

输出:(通过看capacity就能看出其运行原理了)

new adeleted a1new bdeleted adeleted b2new cdeleted bdeleted adeleted c4new ddeleted d4new fdeleted ddeleted cdeleted bdeleted adeleted f8deleted fdeleted ddeleted cdeleted bdeleted aProgram ended with exit code: 0

网友提问:

#include <iostream>#include <vector>using namespace std;struct test{    test(char c) :a(c)    {        cout << "New " << a << endl;    }    ~test()    {        cout << "delete " << a << endl;    }    char a;};int main(){    vector<test> t;    for (char c = 'a'; c < 'z' + 1; ++c) {        t.push_back(c);        cout << t.capacity() << endl;    }    system("pause");}

这样大概就能看明白了吧。

New adelete a1New bdelete adelete b2New cdelete bdelete adelete c4New ddelete d4New edelete ddelete cdelete bdelete adelete e8New fdelete f8New gdelete g8New hdelete h8New idelete hdelete gdelete fdelete edelete ddelete cdelete bdelete adelete i16New jdelete j16New kdelete k16New ldelete l16New mdelete m16New ndelete n16New odelete o16New pdelete p16New qdelete pdelete odelete ndelete mdelete ldelete kdelete jdelete idelete hdelete gdelete fdelete edelete ddelete cdelete bdelete adelete q32New rdelete r32New sdelete s32New tdelete t32New udelete u32New vdelete v32New wdelete w32New xdelete x32New ydelete y32New zdelete z32delete zdelete ydelete xdelete wdelete vdelete udelete tdelete sdelete rdelete qdelete pdelete odelete ndelete mdelete ldelete kdelete jdelete idelete hdelete gdelete fdelete edelete ddelete cdelete bdelete aProgram ended with exit code: 0
0 0