C++中的vector对象和STL标准模板库

本文最后更新于:2 小时前

vector

为什么需要vector

  • 封装任何类型的动态数组,自动创建和删除
  • 数组下标越界检查

vector对象的使用

  • 创建 vector<元素类型> 对象名

  • 访问 vector对象名[下标表达式]

  • vector数组对象名不表示数组首地址

  • 获得数组长度 vector对象名.size()

  • 在自定义函数中传入vector参数列表 vector<元素类型> &数组名

  • 基于范围的for循环配合auto

    #include<vector>
    #include<iostream>
    int main() {
        std::vector<int> v = { 1, 2, 3 };
        for ( auto i = v.begin(); i != v.end(); i++ ) {
            //i为指针,取出指针指向的元素使用*i
            std::cout << *i << std::endl;
        }
        for ( auto e : v ) {
            std::cout << e << std::endl;
        return 0;
    }

STL标准模板库

STL简介

  • Standard Template Library定义了一套概念体系,为泛型程序设计提供了逻辑基础
  • STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的
  • 使用STL的模板时,类型参数既可以是C++标准库中已有的类型,也可以时自定义的类型–只要这些类型是所要求概念的模型

STL的基本组件

Iterators(迭代器)

  • Iterators(迭代器)是算法和容器的桥梁

    • 将迭代器作为算法的参数、通过迭代器来访问容器,而不是把容器直接作为算法的参数
  • 将函数对象作为的算法的参数,而不是将函数所执行的运算作为算法的一部分

  • 使用STL中提供的或自定义的迭代器和函数对象,配合STL的算法,可以组合出各种各样的功能


  • 提供了顺序访问容器中的每个元素的方法
  • 可以使用++运算符来获得指向下一个元素的迭代器
  • 可以使用*运算符访问迭代器所指向的元素,如果元素类型是类或结构体,还可以使用->运算符直接访问该元素的一个成员
  • 有些迭代器还支持通过–运算符获得指向上一个元素的迭代器
  • 迭代器是泛化的指针:指针也具有同样的特性,因此指针本身就是一种迭代器
  • 使用独立于STL容器的迭代器,需要包含头文件<iterator>

container(容器)

  • 容纳、包含一组元素的对象
  • 基本容器类模板
    • 顺序容器:array(数组)、vector(向量)、deque(双端队列)、forward_list(单链表)、list(列表)
    • (有序)关联容器:set(集合)、multiset(多重集合)、map(映射)、multimap(多重映射)
    • 无序关联容器:unordered_set(无序集合)、unordered_multiset(无序多重集合)、unordered_map(无序映射)、unordered_multimap(无序多重映射)

  • 容器的通用功能

    • 用默认构造函数构造空容器
    • 支持关系运算符
    • begin()、end()获得容器首、尾迭代器
    • clear()将容器清空
    • empty()判断容器是否为空
    • size()得到容器元素个数
    • s1.swap(s2)将s1和s2两容器内容交换
  • 相关数据类型(S表示容器类型)

    • S::iterator指向容器元素的迭代器类型
    • S::const_iterator常迭代器类型
  • 对可逆容器的访问

    • STL为每个可逆容器都提供了逆向迭代器,逆向迭代器可以通过下面的成员函数得到

      • rbegin()指向容器尾的逆向迭代器
      • rend()指向容器首的逆向迭代器
    • 逆向迭代器的类型名的表示方法如下

      • S::reverse_iterator逆向迭代器类型
      • S::const_reverse_iterator逆向常迭代器类型

容器适配器

  • stack(栈)
  • queue(队列)
  • priority_queue(优先队列)

function object(函数对象)

  • 一个行为类似函数的对象,对它可以像调用函数一样调用
  • 函数对象是泛化的函数:任何普通的函数和任何重载了()运算符的类的对象都可以作为函数对象使用
  • 使用STL的函数对象,需要包含头文件<functional>

algorithms(算法)

  • 可以广泛用于不同的对象和内置的数据类型

  • STL包括70多个算法

    • 排序算法
    • 消除算法
    • 计数算法
    • 比较算法
    • 变换算法
    • 置换算法
    • 容器管理
    • ……
  • 使用STL的算法,需要包含头文件<algorithms>


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!