type
status
date
slug
summary
tags
category
icon
password
Property
vector
是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector
是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector
是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。vector
的扩充机制
按照容器现在容量的一倍进行增长。
vector
容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。迭代器
_First
指向使用空间的头部,_Las
t指向使用空间大小(size)的尾部,_End
指向使用空间容量(capacity)的尾部不同的的编译器实现扩容方式不同,vs编译器每次是以1.5倍且向下取整的策略进行扩容,
gcc
编译器则是每次以2.0倍的策略进行扩容。扩容的大小叫做扩容因子:- 扩容因子大,每次需要分配的新内存空间越多,分配空间耗时。空闲空间较多,内存利用率低。
- 扩容因子小,需要再分配的可能性更高,扩容耗时。空闲空间较少,内存利用率较。
vector的构造
vector()
:创建一个空vector
vector(int nSize)
:创建一个vector
,元素个数为nSize
vector(int nSize,const t& t)
:创建一个vector
,元素个数为nSize
,且值均为t
vector(const vector&)
:复制构造函数
vector(begin,end)
:复制[begin,end)
区间内元素到vector
中
vector迭代器使用
- iterator :正向迭代器
- reverse_iterator:反向迭代器
- const_iterator:常量迭代器
- const_reverse_iterator:常量反向迭代器
begin()
返回指向容器中第一个元素的迭代器
end()
返回指向容器最后一个元素所在位置后一个位置的迭代器cbegin()
:在begin()
基础上,增加了const
属性,不能用于修改元素
cend()
:在end()
基础上,增加const
属性,不能用于修改元素rbegin()
:反向,返回指向最后一个元素的迭代器
rend()
:反向,返回指向第一个元素所在位置前一个位置的迭代器crbegin()
:在rbegin()
基础上,增加了const
属性,不能用于修改元素
crend()
:在rend()
基础上,增加了const
属性,不能用于修改元素vector容量操作
函数成员 | 函数功能 |
size() | 返回实际元素个数 |
max_size() | 返回元素个数的最大值。这通常是一个很大的值,很少会用到 |
resize() | 改变实际元素的个数 |
capacity() | 返回当前容量 |
empty() | 判断容器中是否有元素,若无元素,则返回 true |
reserve() | 增加容器的容量 |
shrink _to_fit() | 将内存减少到等于当前元素实际所使用的大小 |
vector增删查改
函数成员 | 函数功能 |
operator[ ] | 重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素 |
at() | 使用经过边界检查的索引访问元素 |
front() | 返回第一个元素的引用。 |
back() | 返回最后一个元素的引用。 |
data() | 返回指向容器中第一个元素的指针。 |
assign() | 用新元素替换原有内容。 |
push_back() | 尾插 |
pop_back() | 尾删 |
insert() | 在指定的位置插入一个或多个元素。 |
erase() | 移出一个元素或一段元素。 |
clear() | 移出所有的元素,容器大小变为 0。 |
swap() | 交换两个容器的所有元素。 |
emplace() | 在指定的位置直接生成一个元素。 |
emplace_back() | 在序列尾部生成一个元素。 |
迭代器失效
在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值,否则会失效