C++STL之vector的使用详解

C++STL之list的使用详解

C++STL之map的使用详解

一、简介

1、底层

连续存储的容器,动态数组,在堆上分配空间,支持随机访问,尾部插入、尾部删除时间复杂度为O(1),头部插入、头部删除时间复杂度为 O(n)。 

 2、扩容机制

不同编译器如VS和GCC在扩容策略上存在差异,VS采用1.5倍扩容,而GCC采用2.0倍扩容。vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。

如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。

3、性能

① 访问:

随机访问性能很好,O(1),插入删除性能差。

② 插入:

在最后插入(空间够):很快,一般是常数开销;

在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝;

在中间插入(空间够):内存拷贝;

在中间插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。

③ 删除

在最后删除:很快,一般是常数开销;

在中间删除:内存拷贝。

4、适用场景:

vector 拥有一段连续的内存空间,因此支持随机访问。如果需要高效的随机访问,而不在乎插入和删除的效率,使用 vector。

二、基本操作

1、初始化

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> v; // 无参构造
    
    vector<int> v1(10, 0); // 初始化v1, 数组内有10个0
    
    vector<int> v2(v1.begin(), v1.end()); // 迭代器初始化,将v2中数据拷贝至v3
    
    vector<int> v3(v2); // 拷贝构造
    
    vector<int> v4 = v3; // 拷贝构造
    
    return 0;
}

2、插入数据

① 尾插
v.push_back(1);
② insert插入

在pos位置前插入数据val。例如:insert(v.end(), val)

v.insert(v.end(), 2); // 在尾部插入数据2

在pos位置前插入n个val。例如:insert(v.end(), n, val)

v.insert(v.end(), 2, 3); // 在尾部插入两个3

在pos位置前插入一段迭代器区间。例如:insert(v.end(), v1.begin(), v1.end())

v.insert(v.end(), v1.begin(), v1.end()); // 在尾部插入一段区间的数据

3、删除数据

① erase() 删除数据

删除pos位置数据,参数为迭代器。

v.erase(v.end()-1); // 删除最后一个数据

删除一段迭代器区间数据,第一个参数为迭代器,即初始位置,第二个也为迭代器,即结束位置。(左闭右开,最左边元素会删除,最右边元素不会删除)

v.erase(v.begin(), v.end());
② pop_back() 删除最后一个数据
if (!v.empty())
{
    v.pop_back();
}

 注:迭代器失效问题 

4、修改数据

① 使用方括号 [ ]
v[0] = 1;
② swap() 交换两个vector数据
v.swap(v1); // 交换v和v1内数据

5、查找数据

auto it = find(v.begin(), v.end(), 12); // 查找值为12的数据
if (it != v.end())
{
    cout << *it << endl;
}

6、其他用法

① 访问

使用 [] 访问。

v[0] = 1;

使用迭代器访问。

正向迭代器访问

for (auto it = v.begin(); it != v.end(); ++it) // 正向迭代器访问
{
    cout << *it << " ";
}
cout << endl;

反向迭代器访问 

for (auto it = v.rbegin(); it != v.rend(); ++it) // 反向迭代器访问
{
    cout << *it << " ";
}
cout << endl;

C++11基于范围的迭代写法

for (auto const& val : v)
{
    cout << val << " ";
}
② 获取元素个数
int size = v.size();
③ 获取容量大小
int capacity = v.capacity();
④ 判空
if (v.empty())
{
    cout << "vector is empty" << endl;
}

ok,今天分享就到这里了。

如果觉得分享对你有所帮助的话,记得点赞哦!

主页还有其他相关文章,欢迎一起学习,一起进步~

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值