Effective STL - 容器

STL(standard template library)提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以存若干个值。

STL容器是同质的,即存储的值的类型相同;算法是完成特定任务的处方;迭代器是能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。

STL不是面向对象编程,而是一种不同的编程模式-通用编程模式(generic programming)。

1. 慎重选择容器类型

  • 标准STL序列容器: vector, string, deque 和 list.
  • 标准STL关联容器:set, multiset, map 和 multimap.
  • 非标准序列容器slist 和 rope.
  • 非标准的关联容器 hash_set, hash_multiset, hash_map 和 hash_multimap.

  基于算法复杂性考虑:

    vector是默认应使用的序列类型;当需要频繁地在序列中间做插入和删除操作时,应使用list;当大多数插入和删除操作发生在序列的头部和尾部时,deque是应考虑的数据结构。

   STL一种分类方法:连续内存容器(contiguous-memory container)和 基于节点的容器(node-based container)。

 

2. vector 

   vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

  • 将元素置于一个动态数组中进行管理
  • 可以随机存取元素(用索引直接存取)
  • 在数组尾部添加或移除元素非常快速,但是在中部和头部安插元素比较费时

  使用说明:

  使用vector前,必须包含头文件<vector>

  例: vector<int> vec;

        操作:vec.size() //容器实际数据的个数

                vec.begin()//指向迭代器中的第一个数据地址

                vec.capacity() //返回容器中数据的个数

                vec.empty() //判断容器是否为空

                vec.front() //返回第一个数据

                vec.push_back(element) //在尾部加入一个元素

                vec.pop_back(element) //删除最后一个数据

                vec.end() //指向迭代器中末端的下一个,指向不存在元素

3. deque

    是一种具有队列和栈的性质的数据结构。

  • deque,是 double-ended queue 缩写
  • 可以随机存取元素(用索引直接存取)
  • 在数组尾部添加或移除元素非常快速,但是在中部和头部安插元素比较费时

4. list

  • 双向链表
  • 不提供随机存取(按顺序走到需要存取的元素,O(n))
  • 在任何位置插入和删除都非常迅速,内部只需调整一下指针

5.  iterator

  iterator(迭代器) 是一种对象,它能够用爱遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定地址。迭代器修改了常规指针的接口。

  • 迭代器是一个所谓的智能指针,具有遍历复杂数据结构的能力。迭代器是一个“可遍历stl容器内全部或部分元素”的对象
  • 一个迭代器指出容器的一个特殊位置
  • 具有遍历复杂数据结构的能力

6. 容器的共通能力

   所有容器提供都是value语义,而非reference。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。

   每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
  
通常STL不会丢出异常。要求使用运行者对确保传入正确的参数。

7. 容器的共通操作

   1) 与大小相关的操作函数

        c.size()  传回容器中的元素数量

        c.empty() 判断容器是否为空

        c.max_size() 传回元素最大可能数量

   2)返回迭代器的函数

        c.begin()

        c.end()

        c.rbegin()  返回一个逆向迭代器,指向逆向寻访时的第一元素

        c.rend()



转载于:https://my.oschina.net/leaynOntheroad/blog/167085

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值