C++面试题:介绍一下STL,具体说明STL如何实现vector。
来源:互联网 发布:ios9.3.2越狱软件源 编辑:程序博客网 时间:2024/05/01 15:57
C++面试题:介绍一下STL,具体说明STL如何实现vector。
考点:vector的理解与实现细节
出现频率:★★★★
解析:
前面例题已经介绍过了STL,因此这里不再赘述,只说明STL如何实现vector。
vector的定义如下:
template<class _Ty, class _A = allocator<_Ty> >
class vector {
……
};
这里省略了中间的成员。其中_Ty类型用于表示vector中存储的元素类型,_A默认为allocator<_Ty>类型。
这里需要说明的是allocator类,它是一种“内存配置器”,负责提供内存管理(可能包含内存分配、释放、自动回收等能力)相关的服务。于是对于程序员来说,就不用关心内存管理方面的问题。
vector支持随机访问,因此为了效率方面的考虑,它内部使用动态数组的方式实现的。当进行insert或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配,一般是当前大小的两倍,然后把原数组的内容拷贝过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。例如下面的程序:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v; //初始时无元素,容量为0
cout << v.capacity() << endl;
v.push_back(1) ; //容量不够,分配1个元素内存
cout << v.capacity() << endl;
v.push_back(2); //容量不够,分配2个元素内存
cout << v.capacity() << endl;
v.push_back(3); //容量不够,分配4个元素内存
cout << v.capacity() << endl;
v.push_back(4);
v.push_back(5); //容量不够,分配8个元素内存
cout << v.capacity() << endl;
v.push_back(6);
v.push_back(7);
v.push_back(8);
v.push_back(9); //容量不够,分配16个元素内存
cout << v.capacity() << endl;
return 0;
}
下面是各个执行步骤:
(1)代码7行,初始化时v无元素(size为0),且容量(capacity)也为0。
(2)代码9行,在数组末尾添加元素1,由于容量不够,因此allocator分配1个int大小的内存,并把整数1复制到这个内存中。
(3)代码11行,在数组末尾添加元素2。此时容量为1,但元素个数需要变为2,因此容量不够,于是allocator先分配原来容量的2倍大小的内存(即2个int大小的内存),然后把原来数组中的1和新加入的2拷贝到新分配的内存中,最后释放原来数组的内存。
(4)代码13行,在数组末尾添加元素3。此时容量为2,而元素个数需要变为3,因此容量也不够。和(3)相同,allocator分配4个int的内存,然后把原来数组中的1、2以及新加入的3拷贝到新分配的内存,最后释放原数组的内存。
(5)代码15行,在数组末尾添加元素3。此时容量为4,而元素个数需要变为3,因此容量足够,不需要分配内存,直接把4拷贝到数组的最后即可。
以后的操作不再赘述。注意vector的size()和capacity()是不同的,前者表示数组中元素的多少,后者表示数组有多大的容量。由上面的分析可以看出,使用vector的时候需要注意内存的使用,如果频繁地进行内存的重新分配,会导致效率低下。
答案:
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库中,包括容器、算法、迭代器组件。
vector内部使用动态数组的方式实现的。如果动态数组的内存不够用,就要动态的重新分配,一般是当前大小的两倍,然后把原数组的内容拷贝过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。它的内部使用allocator类进行内存管理,程序员不需要自己操作内存。
考点:vector的理解与实现细节
出现频率:★★★★
解析:
前面例题已经介绍过了STL,因此这里不再赘述,只说明STL如何实现vector。
vector的定义如下:
template<class _Ty, class _A = allocator<_Ty> >
class vector {
……
};
这里省略了中间的成员。其中_Ty类型用于表示vector中存储的元素类型,_A默认为allocator<_Ty>类型。
这里需要说明的是allocator类,它是一种“内存配置器”,负责提供内存管理(可能包含内存分配、释放、自动回收等能力)相关的服务。于是对于程序员来说,就不用关心内存管理方面的问题。
vector支持随机访问,因此为了效率方面的考虑,它内部使用动态数组的方式实现的。当进行insert或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配,一般是当前大小的两倍,然后把原数组的内容拷贝过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。例如下面的程序:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v; //初始时无元素,容量为0
cout << v.capacity() << endl;
v.push_back(1) ; //容量不够,分配1个元素内存
cout << v.capacity() << endl;
v.push_back(2); //容量不够,分配2个元素内存
cout << v.capacity() << endl;
v.push_back(3); //容量不够,分配4个元素内存
cout << v.capacity() << endl;
v.push_back(4);
v.push_back(5); //容量不够,分配8个元素内存
cout << v.capacity() << endl;
v.push_back(6);
v.push_back(7);
v.push_back(8);
v.push_back(9); //容量不够,分配16个元素内存
cout << v.capacity() << endl;
return 0;
}
下面是各个执行步骤:
(1)代码7行,初始化时v无元素(size为0),且容量(capacity)也为0。
(2)代码9行,在数组末尾添加元素1,由于容量不够,因此allocator分配1个int大小的内存,并把整数1复制到这个内存中。
(3)代码11行,在数组末尾添加元素2。此时容量为1,但元素个数需要变为2,因此容量不够,于是allocator先分配原来容量的2倍大小的内存(即2个int大小的内存),然后把原来数组中的1和新加入的2拷贝到新分配的内存中,最后释放原来数组的内存。
(4)代码13行,在数组末尾添加元素3。此时容量为2,而元素个数需要变为3,因此容量也不够。和(3)相同,allocator分配4个int的内存,然后把原来数组中的1、2以及新加入的3拷贝到新分配的内存,最后释放原数组的内存。
(5)代码15行,在数组末尾添加元素3。此时容量为4,而元素个数需要变为3,因此容量足够,不需要分配内存,直接把4拷贝到数组的最后即可。
以后的操作不再赘述。注意vector的size()和capacity()是不同的,前者表示数组中元素的多少,后者表示数组有多大的容量。由上面的分析可以看出,使用vector的时候需要注意内存的使用,如果频繁地进行内存的重新分配,会导致效率低下。
答案:
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库中,包括容器、算法、迭代器组件。
vector内部使用动态数组的方式实现的。如果动态数组的内存不够用,就要动态的重新分配,一般是当前大小的两倍,然后把原数组的内容拷贝过去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。它的内部使用allocator类进行内存管理,程序员不需要自己操作内存。
0 0
- C++面试题:介绍一下STL,具体说明STL如何实现vector。
- C++面试题:介绍一下STL,STL如何实现vector
- C++面试题:介绍一下STL,STL如何实现vector
- C++面试题:介绍一下STL,STL如何实现vector
- C++面试题:介绍一下STL如何实现vector
- C++STL常见面试题
- C++STL常见面试题
- C++STL常见面试题
- C++STL常见面试题
- 【STL C++】简单实现vector
- C++STL vector介绍与使用方法
- C++STL中的vector简要介绍
- C++STL常见面试题1
- c++STL常见面试题2
- STL vector 容器介绍
- STL vector 容器介绍
- STL vector 容器介绍
- STL vector 容器介绍
- poj-1226-Substrings
- linux目录结构
- Apache/2.4.9启动错误:AH01630: client denied by server configuration
- SOJ1824: The Suspects
- Win7 下的WiFi共享功能(win7自带)
- C++面试题:介绍一下STL,具体说明STL如何实现vector。
- floyd算法
- mongodb的副本集脑裂情况
- POJ2139 Six Degrees of Cowvin Bacon 最短路
- getopt函数
- boj409.数的关系(高精度java模板)
- 编程算法 - 求1+2+...+n(构造函数) 代码(C++)
- 本博客迁移到Github,之后停止更新
- 谈谈下午的员工入职培训