智能指针可以放到容器中么_C++ STL 容器和原理(一)

a114a3fb76008ea8ea302722bc748add.png

写在前面。本文总结自C++Primer和STL源码分析。可能不太适合初学者,仅为对自己学习的一个总结和回顾,希望能帮到有同样需求的人。后面原理写了迭代器,vector和list的实现。红黑树相关的关系容器感觉写的有点草率,先放放。

顺序容器(sequenial container)

STL标准库中,提供了多种不同的顺序容器,可变大小数组vector,双端队列deque,双向链表llist,固定大小数组array等。不同的容器在以下两方面都有不同的性能折中:

  1. 向容器添加或从容器删除元素的代价。
  2. 非顺序访问容器中元素的代价。

容器保存元素的策略对容器操作的效率有着固有的,重大的影响,不同容器的存储策略影响特定容器是否支持特定的操作。

  • string和vector将元素保存在连续的内存空间中。可快速通过下标访问。但从中间位置添加或删除元素非常耗时。
  • list和forward_list设计目的是令容器在任意位置的元素添加和删除都非常迅速。相应的代价是不支持随机访问,访问特定元素需要遍历整个容器。且链表需要分配大量的额外空间。
  • deque在两端添加删除的速度很快,但在中间添加删除元素代价依旧很高。deque支持快速的随机访问。

确定使用哪种容器

  • 除非有充分的理由选择其他容器,否则vector永远是最好的选择。
  • 如果元素中有大量小元素且内存额外开销很重要,避免使用list和forward_list。
  • 如果要求随机访问,应使用vector或deque。
  • 如果程序要求在中间插入或删除,应使用list或forward_list。
  • 如果程序需要在头尾插入删除,则应使用双端队列deque。
  • 如果程序开始时需要中间插入,之后需要随机访问。
  1. 可以使用sort函数重排未实现中间插入的元素。
  2. 可以使用list完成输入任务,之后将中间插入后的元素拷贝到vector中。

迭代器(iterator)

迭代器类似于指针,w提供对对象的间接访问。

迭代器范围由一对迭代器表示。迭代器的end标识指向容器最后一个容器之后的元素。故迭代器的范围是一个左闭合区间

auto 

赋值与swap

vector

swap操作不会对任何元素进行拷贝,删除插入,可以在常数时间内完成操作。故指向容器的迭代器,引用,指针在swap操作之后不会失效。

由于赋值运算符要求左边和右边的运算对象具有相同的类型。所以定义assign的成员,允许从一个不同但相容的类型赋值,或者从容器的一个子序列赋值。

list

顺序容器操作

TIPS:在向一个vector,string或deque插入元素会使得所有指向容器的迭代器,引用指针失效。

使用push_back

push_back放入容器中的是元素的拷贝。容器中的元素与提供对象之间没有任何关联。随后对容器中元素的任何改变都不会影响原始对象。

使用insert的返回值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值