[C++]vector 的 push_back实现原理
2016-04-12 21:21
441 查看
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 a deleted a 1 new b deleted a deleted b 2 new c deleted b deleted a deleted c 4 new d deleted d 4 new f deleted d deleted c deleted b deleted a deleted f 8 deleted f deleted d deleted c deleted b deleted a Program 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 a delete a 1 New b delete a delete b 2 New c delete b delete a delete c 4 New d delete d 4 New e delete d delete c delete b delete a delete e 8 New f delete f 8 New g delete g 8 New h delete h 8 New i delete h delete g delete f delete e delete d delete c delete b delete a delete i 16 New j delete j 16 New k delete k 16 New l delete l 16 New m delete m 16 New n delete n 16 New o delete o 16 New p delete p 16 New q delete p delete o delete n delete m delete l delete k delete j delete i delete h delete g delete f delete e delete d delete c delete b delete a delete q 32 New r delete r 32 New s delete s 32 New t delete t 32 New u delete u 32 New v delete v 32 New w delete w 32 New x delete x 32 New y delete y 32 New z delete z 32 delete z delete y delete x delete w delete v delete u delete t delete s delete r delete q delete p delete o delete n delete m delete l delete k delete j delete i delete h delete g delete f delete e delete d delete c delete b delete a Program ended with exit code: 0
相关文章推荐