STL容器——vector

vector: 是一种序列式容器,和数组类似,但它比数组更优越,是一种动态单向数组。

一:vector特点:

1.动态分配空间,当空间不足时,会执行分配新空间——复制元素——释放原空间;

2.在末端插入和删除执行效率高,在其他位置插入和删除效率低(为保持原有相对次序,插入和删除点之后的元素需要整体后移);

3.删除数据并不会释放已分配的空间,因此vector的capacity(容量)大于vector的size(元素个数);

4.支持随机访问,且执行效率高;

5.vector是线程安全的,所有操作加了同步锁,不支持多线程操作。

二:vector定义与初始化

vector<int> v;//定义int型向量(capacity和size为0)

vector<int> v1(10);//拥有10个元素,元素默认为0(capacity和size为10)

vector<int> v2(10, 10);//拥有10个元素,元素默认为10(capacity和size为10)

vector<int> v3 = { 1, 2, 3, 4 }; //拥有4个元素(capacity和size为4)

vector<int> v4{ 1,2,3,4 };//同v3

vector<int> v5(v3); //定义新容器,拷贝v3所有元素

vector<int> v6 = v3;//同v5

vector<int> v7(v3.begin(), v3.end());//定义新容器,拷贝v3区间内元素

三:基本操作

v3.push_back(1);//向量末端插入数值1
v3.size();//向量元素个数
v3.at(0); //访问向量第一个元素,类似v[0]
v3.capacity();//向量分配空间大小
v3.back();//获取尾部数据
v3.front();//获取头部数据
v3.pop_back();//尾部删除,不会释放已分配空间(capacity)
v3.insert(v3.end(), 1);//末端插入1
v3.insert(v3.end(), 5, 1);//末端插入5个1
v3.insert(v3.end(), v4.begin(), v4.end());//
v3.erase(v3.begin() + 1);//删除指定位置值
v3.erase(v3.begin(), v3.begin() + 3);//删除区间值
v3.reserve(20);//vector的大小设置为20,元素值为随机值(不是默认值)
v3.resize(20);//vector的大小设置为20,元素值为默认值
v3.resize(20, 1);//vector的大小设置为20,新分配空间元素值为1
v3.assign(2, 3);//赋值函数,将2个3赋值给v3,会改变v3的size(size为2)
v3.emplace(v3.begin(), 1);//插入函数,begin之前插入1
v3.clear();//清除向量元素(size),不会释放已分配空间(capacity)
v3.empty();//容器判空(size为0返回true)
v3.shrink_to_fit();//时capacity与size大小一致

emplace / push_back / insert的区别

1.emplace直接在指定位置插入数据;而push_back和insert需要先生成具有复制内容的对象,然后将对象内容复制到容器中;

2.emplace和push_back只能插入一个数据,而insert可以插入多个数据;push_back只能在末端插入,insert可以在任意地方;

3.插入效率emplace>push_back>insert

四:迭代器

包括: begin、end、rbegin、rend、cbegin、cend、crbegin、crend

v3.begin(); 返回迭代器, 指向第一元素
v3.end(); 返回迭代器, 指向最末元素的下一个位置
v3.cbegin(); 返回迭代器, 指向第一元素, 类型为const
v3.cend(); 返回迭代器, 指向最末元素的下一个位置, 类型为const
v3.rbegin(); 返回反向迭代器, 指向反向迭代的第一元素
v3.rend(); 返回反向迭代器, 指向反向迭代的最末元素的下一个位置
v3.crbegin(); 返回反向迭代器, 指向反向迭代的第一元素, 类型为const
v3.crend(); 返回反向迭代器, 指向反向迭代的最末元素的下一个位置, 类型为const

begin和cbegin的区别
可以通过v.begin()修改容器内元素的值
不能通过v.cbegin()修改容器内元素的值

五:std::vector和std::array

std::vector是自动扩容的,而std::array是大小固定的。std::vector删除元素后,内存不会自动回收,需要手动运行shrink_to_fit释放这部分内存。当容器大小固定时,优先选择array。

六:总结

1.如果已知构造的vector的大小,且元素设置为特定值,则调用resize(),将vector所需的的内存大小直接开辟出来,否则会引发扩容时的重开空间、拷贝数据、释放原空间这一系列操作,降低了效率;

2.已知构造的vector的大小,对元素值没有特定要求,则调用reserve(),因为resize()会遍历整个vector,进行赋值,而reserve只开辟空间,不会遍历,效率更高;

3.erase 的返回值为所删除元素的下一个元素的迭代器,如果删除到尾,则会返回end(),所以,在每次调用erase函数之后应该用其返回值来更新迭代器,从而避免因迭代器失效而引起的错误;

4.扩容方式:开辟新空间——原数据插入到新空间——释放旧空间——指向新空间;

5.时间复杂度:访问时间复杂度时O(1);插入时间复杂度:push_back为O(1),insert为O(n);删除时间复杂度:pop_back为O(1),erase为O(n)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了一组数据结构和算法的模板类,可以大大简化C++程序的开发过程。STL包含了多个容器类,每个容器类都有其特定的特性和用途。 STL中的容器类主要分为序列容器和关联容器两大类。序列容器包括vector、list、deque和array,它们按照元素在容器中的位置进行存储和访问。关联容器包括set、multiset、map、multimap和unordered系列容器,它们按照键值进行存储和访问。 序列容器具有以下特性: 1. 动态大小:序列容器可以根据需要动态调整大小,可以在任意位置插入和删除元素。 2. 快速随机访问:序列容器中的元素可以通过索引快速访问,时间复杂度为O(1)。 3. 按顺序存储:序列容器中的元素按照插入的顺序存储,并保持元素的相对位置不变。 4. 支持迭代器:序列容器提供了迭代器,可以通过迭代器遍历容器中的元素。 关联容器具有以下特性: 1. 自动排序:关联容器中的元素按照键值自动排序,并且可以根据自定义的比较函数进行排序。 2. 快速查找:关联容器支持快速的查找操作,时间复杂度为O(log n)。 3. 不允许重复键值:set和map容器中的键值是唯一的,而multiset和multimap容器允许重复的键值。 4. 无序容器:unordered系列容器是C++11引入的,它们使用哈希函数来存储和访问元素,查找操作的平均时间复杂度为O(1)。 总而言之,C++ STL提供了丰富的容器类,每个容器类都有其独特的特性和适用场景,可以根据具体需求选择合适的容器来存储和操作数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++——STL容器](https://blog.csdn.net/JAN6055/article/details/122758690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++的STL容器类详解](https://blog.csdn.net/Jinyizhi2233/article/details/131640448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值