C++STL学习总结系列之【序列式容器——vector】

目录

特点

vector的数据结构

例子

vector的构造函数

1.不带参数的构造函数

2.默认的拷贝构造函数

3.创建一个有n 个对象的 vector

4.创建一个包含从 start 到 end 之间的所有元素的 vector

5.利用数组创建vector

vector操作的内存管理

push_back

pop_back

erase


特点

其操作方式与C++中的数组array类似,但两者的区别在于空间运用的灵活性

1.array是静态空间,一旦配置就不能再改变大小

2.vector是动态空间,随着vector容器中的元素不断加入,其内部机制会自行扩充空间以容纳新元素

vector的数据结构

vector采用线性连续空间,其中包含三个迭代器start、finish、end_of_storage

迭代器start指向配置的连续空间中的起始位置

迭代器finish指向配置的连续空间中已使用范围的末尾位置的下一个位置

迭代器end_of_storage指向整块连续空间的尾端

size标识已使用空间的大小,capacity标识整个vector连续空间的大小

例子

vector的构造函数

1.不带参数的构造函数

vector<int> vec;
cout<<"capacity"<<vec.capacity();

只生成一个vector实例,输出的大小为0

2.默认的拷贝构造函数

创建一个给定 vector的复本vector

vector<int> vec1(vec);

3.创建一个有n 个对象的 vector

如果value值给定,所有的对象都被赋上value值,否则默认全部初始化为0值

vector<int> vec1(10);
vector<int> vec2(10,2);
auto ite1 = vec1.begin();
auto ite2 = vec2.begin();
while(ite1 != vec1.end())
{
	cout<<*ite1<<" ";
	++ite1;
}
cout<<endl;
while(ite2 != vec2.end())
{
	cout<<*ite2<<" ";
	++ite2;
}

输出 

4.创建一个包含从 start 到 end 之间的所有元素的 vector

vector<int> vec1(10,2);
vector<int> vec(vec1.begin(),vec1.end());
auto ite = vec.begin();
while(ite != vec.end())
{
	cout<<*ite<<" ";
	++ite;
}

输出

 

5.利用数组创建vector

int arr[] = {1,2,3,4,5};
vector<int> vec(arr,arr+5);
auto ite = vec.begin();
while(ite != vec.end())
{
	cout<<*ite<<" ";
	++ite;
}

输出

 

vector操作的内存管理

push_back

当利用push_back()将新元素插入vector尾端中时,首先检查vector容器中是否有备用空间

  • 若存在备用空间,则直接在备用空间中添加元素,调整迭代器finish
  • 若不存在备用空间,则vector进行空间扩容(不同编译器扩容大小不同,VS下是1.5倍,GCC是2倍)

扩容操作并非在原空间之后续接新的地址空间,而是同时包含新地址的分配、旧地址到新地址的元素移动、以及旧地址空间的释放

所以程序运行中一但出现空间重新配置,则指向原vector的迭代器失效

扩容相关问题参考:

https://www.cnblogs.com/-citywall123/p/12846941.html

https://blog.csdn.net/yangshiziping/article/details/52550291

pop_back

只将vector中尾端元素清空,并不会调整vector的空间大小

erase

erase的实现版本有多种,以清除局部区间的操作为例

清空两个迭代器指针(first,last)指向的局部区间内的vector元素

1.首先将last到finish之间的元素全部复制到first开始往后的位置

2.然后将复制的最后位置到finish之间的元素全部清空

需注意此时原迭代器已失效

猜你喜欢

转载自blog.csdn.net/qq_37348221/article/details/114654507