您的位置:首页 > 编程语言 > C语言/C++

[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: