九、类模板和标准模板库STL(Standard Template Library)

来源:互联网 发布:淘宝模板怎么用 编辑:程序博客网 时间:2024/05/23 02:03

1. 类模板

// 使用类模板,就可以适用于不同元素类型,避免创建多个类型的类。template <typename T>      // 类模板的声明class Array{};// 类模板的使用方法:Array<double> arr(4);     // 创建array,初始capacity为4,可以把Array<double>合起来看成一个类名

2. 标准模板库STL

  • 一般支持C++的编译器都带了STL的支持,里面提供了大量的函数模板(通用算法)和类模板
  • STL的头文件一般都是不带.h后缀的,eg: #include <vector> // 不是vector.h
  • STL 使用命名空间 std, 因此要把此前缀去掉的话,要使用using namespace std;

3. 标准模板库STLvector(一维向量)

  • 向量是数组(连续存储)和链表(跳跃存储)的结合体
  • vector 设计之初即是为了改善C语言原生数组的种种缺失与不便,而欲提供一种更有效、更安全的数组。
  • vector 的使用接口刻意模拟C语言原生数组,较明显的差异在于存储器管理,原生数组必须在宣告数组的时候明确指定数组长度(例如 int a[5]),但是 vector 不需要指定,而是会在运行期依据状况自我调整长度,动态增大容量
  • vector 的使用#include <vector> std::vector<T> arr // T 是 vector 要存储的对象集合的类型,该 vector 的变量名称是 arr
    这里写图片描述

4. 标准模板库STLlist(单向链表)

  • list 内部用数据结构的双向连结串列来实现,内部元素内存各处,互相以 link串接起来,每个元素都只知道其前一个元素以及下一个元素的位置。故要遍历整个list,必须从第一个元素开始逐个往下寻访(顺序链式访问,所以只能使用迭代器进行遍历)不支持随机存取(Random Access)
  • list 的强项是高效的插入以及删除,list插入或删除时只需要改动元素的link字段,不需要搬动元素,相对数组、vector等要高效。
  • list在经常需要于集合内部任意位置(即除了头尾以外的其他位置) 频繁增删元素的工作上表现优秀。若仅需要于集合尾端增删元素,那应该优先考虑vector容器,若仅于头尾二端增删元素,那应该优先考虑deque容器。 - list的使用:std::list<T> mylist;
  • list链表中插入/删除一个节点

    • 遍历 list,找到目标位置
    • 调用insert/erase,插入/删除一个节点
      // 链表的遍历for (list<int>::iterator iter = lst.begin(); iter != lst.end(); iter++){    int& value = *iter;    printf("%d, ", value);}// 删除值为3的节点for (list<int>::iterator iter = lst.begin(); iter != lst.end(); iter++){    int& value = *iter;    if (value == 3)    {        lst.erase(iter);        break;    }}

    list

5. 标准模板库STLstring

  • string是字符串的基本模板类 std::basic_string 使用 typedef 定义的模板类实例
  • typedef basic_string< char, char_traits<char>, allocator<char> > string;
  • string本质上是以字符作为元素的vector特化版本;不存在0字符结尾这个概念,能装入’\0’这种数据
  • 定义字符串变量:using namespace std; string kk = "hello world!"
  • 可以用c_str()函数来获取 string 内部的字符串指针

6. 标准模板库STLmap 用于快速查找

  • 在map存储中,是按照键值对来存储的 “key-value”
  • 无论存储了多少数据,总是可以通过key值,直接检索到value的值
  • list使用遍历查找,但需要从头到尾,挨个对比,速度较慢;而map使用映射查找,速度很快
0 0
原创粉丝点击