cpp vector学习笔记
起因是百度实习二面的时候被问了一道类似这样的题:
给我下面的代码,问有没有什么问题。
1 /* ***********************************************
2 Author :111qqz
3 Created Time :2017年02月28日 星期二 14时49分37秒
4 File Name :vector.cpp
5 ************************************************ */
6 #include <cstdio>
7 #include <vector>
8 #include <ctime>
9 using namespace std;
10 int func( int x ) //此处函数的条件是不单调...这样才可以触发问题.
11 {
12 return (x-50)*(x-50)+1;
13 }
14 int main()
15 {
16
17 vector<int>vec;
18 int *pint = NULL;
19 for ( int i = 0 ; i < 100 ; i++)
20 {
21 int x = func(i);
22 vec.push_back(x);
23 if (x<500)
24 {
25 pint = & vec[0];
26 }
27 }
28 if (pint)
29 *pint = 0 ;
30 int siz = vec.size();
31 for ( int i = 0 ; i < siz ; i++) printf("%d\n",vec[i]);
32 return 0;
33 }
34
面试的时候只给了部分代码,func函数没有给出。
当时没有看出问题在哪里...
后来知道了,这道题其实考的是vector的底层实现...
以下内容参考《STL源码解析》4.2章 侯捷著
vector是动态增加空间,但是并不是在原空间后面增加新空间(因为不能保证原空间之后是否还有可以配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,之后才开始在原内容后面构建新内容,并释放原空间。
因此,对vector的任何操作,一旦引起对空间重新配置,指向原vector的所有迭代器都失效了!
因此,对vector的任何操作,一旦引起对空间重新配置,指向原vector的所有迭代器都失效了!
因此,对vector的任何操作,一旦引起对空间重新配置,指向原vector的所有迭代器都失效了!
vector采取的是存储方式是连续线性空间,用两个迭代器start和finsh分别指向当前配置的空间中已经使用的部分的开始和结尾,用另一个迭代器end_of_storage指向当前配置的整块连续空间(包含备用部分)的尾端。
当我们用push_back()将元素插入vector尾端时,push_back()会先检查是是否还有备用空间,如果有就直接在备用空间上构建元素,并调整迭代器finsh,使vector变大。如果没有备用空间了,就扩充空间。
可以用以下代码来测试:
1
2 /* ***********************************************
3 Author :111qqz
4 Created Time :2017年02月28日 星期二 14时33分10秒
5 File Name :vector1.cpp
6 ************************************************ */
7 #include <cstdio>
8 #include <vector>
9 #include <iostream>
10 using namespace std;
11 int main()
12 {
13 vector<int>a;
14 a.push_back(0);
15 int lst = -1;
16 for ( int i = 0 ; i < 200 ; i++)
17 {
18 a.push_back(-1);
19 // if (a.capacity()!=lst)
20 printf("i:%d %d ",i,a.capacity());
21 cout<<&a[0]<<endl;
22 lst = a.capacity();
23 }
24 return 0;
25 }
结果如下: