是一个以线性顺序组织给定类型元素的容器。它支持对任何元素的快速随机访问,以及与序列之间的动态添加和删除。

可以利用索引随机访问

在尾部附加或者移除元素都很快速,但是在中段或起始安插元素比较费时,插入时后面的元素必须移动以保持相对位置

大部分情况元素追加式高速的,有时候可能是缓慢的,vector可能需要重新分配内存并将现有元素复制到对应位置

=====================================================

底层原理

底层是一个动态数组,包含三个迭代器:start和finish之间是已经被使用的空间范围,end_of_stroage是整块连续空间包括备用空间的尾部。

当空间不够装下数据(vec.push_back(val))时,会自动申请另一片更大的空间(1.5倍或者2倍),然后把原来的数据拷贝到新的内存空间,接着释放原来的那片空间【vector内存增长机制】。

当释放或者删除(vec.clear())里面的数据时,其存储空间不释放,仅仅是清空了里面的数据。

因此,对vector的任何操作一旦引起了空间的重新配置,指向原vector的所有迭代器会都失效了。

头文件

#include<vector>

声明元素类型为int的vector

vector<int> v1, v2, v3;

可以通过下标直接访问对应位置的元素

v1[0]

vectorsizecapacity的区别

size为当前容器中元素数量 finish – start

capacity为已经分配的内存可以容纳多少元素 end_of_storage – start

vector中的元素类型不能是引用

vector 的底层实现要求连续的对象排列,引用不是对象,没有实际地址

vector迭代器失效的情况

当插入一个元素到vector中,由于重新引起了内存分配,指向原内存的迭代器会全部失效。

删除容器中一个元素后,该迭代器所指向的元素已经被删除,也会造成迭代器失效。erase方法会返回下一个有效的迭代器,所以在删除元素时需要

it=vec.erase(it);

vector释放内存

vec.clear():清空内容,但是不释放内存。

vector<int>().swap(vec):清空内容,且释放内存,想得到一个全新的vector。

vec.shrink_to_fit():请求容器降低其capacity和size匹配。

vec.clear(); vec.shrink_to_fit();:清空内容,且释放内存。

vector常用函数

2 
3 
4 
5 
6 
7 
8 
vector<int> 
vec . (c ,ø)); 
reverse(vec. begin() , vec . end()) 
sort (vec. begin() , vec . end()); 
vec . ; 
vec . size(); 
find (vec. begin() , vec . end() , 1); 
iterator = vec.erase(iterator)

相关函数

reserve

为容器分配空间,直接扩充到已知大小,可以保证vector中的空间大小(capacity)最少达到参数所指定的大小

C++ 
// vector_reserve. cpp 
// compile with: /EHsc 
#include 
#include <iostream> 
int main( ) 
using namespace std; 
vector < int> VI; 
//vector :iterator Iter; 
vl.push back( 1 ); 
cout "Current capacity of VI 
VI. capacity( ) endl; 
VI. reserve( 28 ) ; 
cout "Current capacity of VI 
VI. capacity( ) endl; 
Output 
Current capacity of VI 
Current capacity of VI

resize

https://docs.microsoft.com/zh-cn/cpp/standard-library/vector-class?view=vs-2019#resize

可以改变有效空间的大小

如果容器的大小小于请求的大小,则向向量添加元素,直到达到请求的大小。如果容器的大小大于请求的大小,则删除最靠近容器末端的元素,直到容器达到大小Newsize。如果容器的当前大小与请求的大小相同,则不采取任何操作。

void resize(size_type Newsize); 
void resize(size_type Newsize, Type Val);

esize函数重新分配大小,改变容器的大小,并且创建对象

当n小于当前size()值时候,vector首先会减少size()值 保存前n个元素,然后将超出n的元素删除(remove and destroy)

当n大于当前size()值时候,vector会插入相应数量的元素 使得size()值达到n,并对这些元素进行初始化,如果调用上面的第二个resize函数,指定val,vector会用val来初始化这些新插入的元素

当n大于capacity()值的时候,会自动分配重新分配内存存储空间。

assign

释放当前vector原来占用的空间并开辟新的空间

两个函数原型

void assign(size_type Count, const Type& Val);

void assign(initializer_list<Type> IList);

template <class InputIterator> void assign(InputIterator First, InputIterator Last);

来自 <https://docs.microsoft.com/en-us/cpp/standard-library/vector-class?view=vs-2019#assign>

第一个相当于个拷贝函数,把first到last的值赋值给调用者;(注意区间的闭合)

第二个把n个x赋值给调用者;

Copy 
/ vector _ assign . cpp 
// compile uith: /EHsc 
*include 
*include <iostream> 
int main() 
using namespace std; 
VI, v2, v3; 
vl.push back(1Ê); 
vl.push back(2Ê); 
vl.push back(3Ê); 
vl.push back(4Ê); 
vl.push back(SÊ); 
cout 
for (auto& v : vl){ 
cout v 
cout endl; 
v2. assign(vl. begin() , 
cout 
for (auto& v : v2){ 
cout v 
cout endl; 
v3.assign(7, 4); 
cout 
for (auto& v : v3){ 
cout v 
cout endl; 
v3.assign({ S, 6, 7 
for (auto& v : v3){ 
cout v 
cout endl; 
Vl. end())•

at

返回参数中下标元素的引用。

Example 
// vector _ at. cpp 
// compile with: /EHsc 
*include 
*include <iostream> 
int main( ) 
using namespace std; 
vector VI; 
VI. push back( 18 ); 
VI. 28 ); 
const int &i 
vl.at( 8 
int &j — 
cout 
cout 
Output 
vl.at( 1 ) ; 
"The first element is 
"The second element is ' 
i endl; 
j endl; 
Copy 
Copy 
The first element is le 
The second element is 28

back

返回向量的最后一个元素。如果向量为空,则返回值未定义。

front

返回指向向量对象中第一个元素的引用。如果向量为空,则返回未定义。

如果front的返回值被赋给一个const_reference,则不能修改vector对象。如果将front的返回值赋给引用,则可以修改vector对象。

// vector _ front . cpp 
// compile with: /EHsc 
*include 
*include <iostream> 
int main( ) 
using namespace std; 
vector VI; 
VI. push back( 18 ); 
VI. 11 ) ; 
int& i = vl.front( ); 
const int& ii = vl.front( ); 
cout "The first integer of VI is "<< i endl; 
// by incrementing i, we move the front reference to the second element 
cout "Now, the first integer of VI is i endl;
Microsoft Visual Studio 
he first integer of VI is 10 
ow, the first integer of VI is 11

//通过增加i,我们将前面的引用移动到第二个元素

erase

将容器中的指定元素删除

ras 
Removes an element or a range of elements in a vector from specified positions. 
iterator erase( 
const_iterator Where) ; 
iterator erase( 
const iterator first, 
const_iterator last) ; 
Parameters 
Where 
Position of the element to be removed from the vector. 
first 
Position of the first element removed from the vector. 
last 
Position just beyond the last element removed from the vector.
// vector erase. cpp 
// compile uith: /EHsc 
*include 
*include <iostream> 
int main( ) 
using namespace std; 
vector VI; 
vector :iterator Iter; 
vl.erase( Vl. begin( ) + 1, 
vl . push 
vl . push 
vl . push 
vl . push 
vl . push 
cout 
back( 
back( 
back( 
back( 
back( 
"VI 
far ( Iter 
cout 
cout end]; 
vl.erase( Vl. begin( ) ) ; 
cout "VI 
far ( Iter 
cout 
cout endl; 
cout "VI 
far ( Iter 
cout 
18 
28 
3e 
48 ) ; 
Vl. begin( ) 
'Iter; 
Vl. begin( ) 
'Iter; 
Vl. begin( ) 
'Iter; 
Iter . 
Iter . 
vl.end( ) 
vl.end( ) 
vl.begin( ) 
vl.end( ) 
Iter 
Iter++ 
Iter++ 
Iter++ 
cout 
Output 
1e 
2e 
2e 
end]; 
2e 3e 48 sa 
3e 4e sa 
se