跳转至

C++STL六大部件

引言

C是一个面向过程的语言,它的标准库是一个一个单一的函数,彼此之间并没有什么关联。而C++的标准模板库(STL,Standard Template Library)主要分为了六大部件,每个部件之间都有紧密的联系。本文将从一个示例出发,逐一简单介绍C++STL的六大部件。

示例:统计容器中大于等于40的个数

以下代码,会统计出vector容器中,≥40的个数。程序输出结果:4

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    int ia[6] = {27, 210, 12, 40, 109, 83};
    std::vector<int, std::allocator<int>> vi(ia, ia+6);
    //std::vector 【容器】类型
    //int 数据类型
    //std::allocator<int>> 【分配器】使用STL提供的分配器

    auto result = std::count_if(    //【算法】计算满足条件的个数
        vi.begin(), vi.end(),   //【迭代器】此算法处理哪些数据,以范围的形式提供
        //第三个参数需要传入一个【仿函数】,作为谓词条件
        //  count_if会遍历容器中的元素,分别调用这个仿函数,如果返回true,则count+1
        std::not1(  //【适配器】条件取反,将传入的参数取反
            std::bind2nd(   //【适配器】将40传入std::less<int>()函数的第二个参数
                std::less<int>(),   
                    //【仿函数】接收两个参数,比较这两个参数的大小
                    //  即std::less<int>(int a, int b)
                    //  1. count_if会遍历范围内的所有元素,并把它当成a传入less()函数
                    //  2. std::bind2nd将40当成b传入less()函数
                40
            )
        )
    );
    std::cout << result << std::endl; //输出:4
    return 0;
}

容器

std::vector<int> vi(ia, ia+6); 即定义了一个存储int类型的可变长数组

  • 容器就是用来存放东西的
  • 存放东西就要占用内存,但是容器会帮我们解决内存的事情。你无需关心内存如何管理,只需要把东西一个一个放进去、或者取出来

空间分配器

【为什么叫空间分配器,而不叫内存分配器】

  • 有可能不是内存,有可能是硬盘、网络资源等等
  • 因此,抽象谈“空间”更为广泛与适用