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    }

结果如下: