深入分析STL标准模板vectorWord文档格式.docx
- 文档编号:15302176
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:26
- 大小:662.28KB
深入分析STL标准模板vectorWord文档格式.docx
《深入分析STL标准模板vectorWord文档格式.docx》由会员分享,可在线阅读,更多相关《深入分析STL标准模板vectorWord文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
c.~vector<
();
销毁所有数据,释放资源;
2.vector容器中常用的函数。
(c为一个容器对象)
c.push_back(elem);
在容器最后位置添加一个元素elem
c.pop_back();
删除容器最后位置处的元素
c.at(index);
返回指定index位置处的元素
c.begin();
返回指向容器最开始位置数据的指针
c.end();
返回指向容器最后一个数据单元的指针+1
c.front();
返回容器最开始单元数据的引用
c.back();
返回容器最后一个数据的引用
c.max_size();
返回容器的最大容量
c.size();
返回当前容器中实际存放元素的个数
c.capacity();
同c.size()
c.resize();
重新设置vector的容量
c.reserve();
同c.resize()
c.erase(p);
删除指针p指向位置的数据,返回下指向下一个数据位置的指针(迭代器)
c.erase(begin,end)
删除begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)
c.clear();
清除所有数据
c.rbegin();
将vector反转后的开始指针返回(其实就是原来的end-1)
c.rend();
将vector反转后的结束指针返回(其实就是原来的begin-1)
c.empty();
判断容器是否为空,若为空返回true,否则返回false
c1.swap(c2);
交换两个容器中的数据
c.insert(p,elem);
在指针p指向的位置插入数据elem,返回指向elem位置的指针
c.insert(p,n,elem);
在位置p插入n个elem数据,无返回值
c.insert(p,begin,end)在位置p插入在区间[begin,end)的数据,无返回值
二、vector接口函数实例分析
【1】vector:
:
assign//用来构造一个vector的函数,类似于copy函数
voidassign(size_type_Count,constType&
_Val);
//_Count指要构造的vector成员的个数,
_Val指成员的数值,他的类型必须与vector类型一致!
template<
classInputIterator>
voidassign(InputIterator_First,InputIterator_Last);
//两个指针,分别指向复制开始和结束的地方!
例如:
运行结果:
【2】vector:
at
//指找到第N个vector成员,就跟我们再数组中找到第N个成员的a[N]类似
referenceat(size_type_Pos);
const_referenceat(size_type_Pos)const;
//找到第_Pos个成员
【3】vector:
back
referenceback();
const_referenceback()const;
返回最后一个的位置
3、vector内存管理相关方法
vector是一种序列式容器(其中的元素可以排序,但是并未排序)。
它和array一样,存储空间是一段连续的内存,因此支持随机访问,但是,和array相比,vector支持动态增加数据。
当使用new来进行动态内存分配,会有三个麻烦:
(1)必须确保会用delete这个分配;
如果后面没有delete,new就会产生一个资源泄露。
(2)必须确保delete使用的是正确形式;
对于分配一个单独的对象,必须使用“delete”。
对于分配一个数组,必须使用“delete[]”。
如果使用了delete的错误形式,结果会未定义。
在一些平台上,程序在运行期会死掉。
另一方面,它会默默的走向错误,有时候会造成资源泄露,一些内存也随之而去。
(3)一个new只delete一次,如果一个分配被删除了不止一次,结果也会未定义。
而STL中vector和string就不会这么麻烦了。
当准备动态分配一个数组(也就是,要写“newT[...]”,首先应考虑使用vcetor或string(一般来说,当T是字符类型的时候使用string,其他用vector,但vcetor<
char>
也可以用作T是字符数组的时候)。
Vcetor和string消除了new和delete的麻烦,因为vector和string会管理自己的内存。
当元素添加到这些容器时它们的内存会增长,而且当一个vector或string销毁时,它们的析构函数会自动销毁容器中的元素,回收存放那些元素的内存。
另外,由于vector是序列容器,所以可以让我们支配作用于这样的容器的整个STL算法。
虽然数组也可以用于STL算法,但没有提供像begin、end和size这样的成员函数,也没有内嵌像iterator、reverse_iterator或value_type那样的typedef。
而且char*指针当然不能和提供了专用成员函数的string竞争。
容器的构造函数
1、C<
T>
创建空容器
2、Cc(c2);
创建c2的一个副本,C和c2必须有相同的容器类型及元素类型
3、Cc(b,e);
创建c,其元素是迭代器b,e范围之间元素的副本。
对于这一条,使用迭代器的时候,不要求容器类型相同。
容器内的元素类型也可以不同,只要他们相互兼容,能够将要复制的元素转化为所构建的新容器的元素类型,即可以实现复制。
4、Cc(n,t);
用n个值为t的元素创建容器c。
(仅适用于顺序容器)。
参数的顺序和语言相适应,n个t。
5、Cc(n);
创建含n个默认值的容器c。
1.template
<
class
T,
Alloc
=
alloc>
2.class
vector
{
3....
4.protected:
5.//vector缺省使用alloc作为空间配置器,并据此另外定义了一个data_allocator,为的是更方便以元素大小为配置单位
6.//专属空间配置器,每次配置一个元素大小
7.
typedef
simple_alloc<
value_type,
Alloc>
data_allocator;
8....
9.
vector()
start(0),
finish(0),
end_of_storage(0)
{}
10.
vector(size_type
n,
const
T&
value)
fill_initialize(n,
value);
}
11.
vector(int
12.
vector(long
13.
explicit
n)
T());
14....
15.void
fill_initialize(size_type
16.
start
allocate_and_fill(n,
//配置空间并设初值
17.
finish
+
n;
//
调整范围
18.
end_of_storage
finish;
19.
20.iterator
allocate_and_fill(size_type
x)
21.
iterator
result
data_allocator:
allocate(n);
//配置n个元素空间
22.
__STL_TRY
23.
全局函数,将result所指的未初始化空间设定为n个初值为x的变量
24.
定义于
stl_uninitialized.h>
。
25.
uninitialized_fill_n(result,
x);
//全局函数
26.
return
result;
27.
2.2push_back()操作时vector内部的过程
push_back()操作将新元素插入容器尾部,该函数首先检查是否还有备用空间(finish!
=end_of_storage),如果有那么就直接在备用空间上构造元素,并调整迭代器finish。
如果没有备用空间了(finish=end_of_storage),就扩充空间(重新配置,移动数据,释放原空间)。
1.
void
push_back(const
2.
if
(finish
!
end_of_storage)
还有备用空间
3.
construct(finish,
直接在备用空间中构建元素
4.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 分析 STL 标准 模板 vector