C++STL简述

打印 上一主题 下一主题

主题 840|帖子 840|积分 2520

一、尺度容器

容器是尺度模板库(STL,standard template library)中的一个核心概念,它指的是那些能够存储和管理数据集合的类。容器的重要目的是提供一种机制,使得步调员可以存储一个元素集合,并以一种统一和高效的方式来处理这些元素,而不需要关心底层数据的具体存储细节。
1. 顺序容器

容器类名(顺序容器)容器名称array数组容器(C++11)forward_list单向链表容器(C++11)vector向量容器deque双端队列容器list双向链表容器vector

<ol>向量容器。
底层数据结构:动态开发的数组,每次以原来空间巨细的2倍进行扩容
​vector vec;​
常用方法

  • 增加:
    方法解释vec.push_back(20)末端添加元素,时间复杂度O(1),可以导致容器扩容vec.insert(it, 20)向迭代器位置插入元素,时间复杂度O(n)
  • 删除:
    方法解释vec.pop_back()删除末端元素 O(1)vec.erase(it)删除it迭代器指向的元素 O(n)
  • 查询:
    [table][tr]方法解释[/tr][tr][td]operator[][/td][td]通过下标随机访问 O(1)[/td][/tr][tr][td]iterator[/td][td]迭代器访问[/td][/tr][tr][td]find(vec.begin(), vec.end(), 3);[/td][td]不是成员方法,是泛型算法函数[/td][/tr][tr][td]for_each(vec.begin(), vec.end(), [] (auto it)->void {coutb;    }};  // 二元函数对象的类int mmain(){
    greator gre;
    bool b = gre(1, 2);  // 像调用函数一样使用函数对象
    1. // 删除偶数
    2. auto it2 = vec.begin();
    3. while(it2!=vec.end())
    4. {
    5.     if(*it2%2 == 0 )
    6.     {
    7.         it2 = vec.erase(it2);  //更新迭代器。 erase删除迭代器指向的元素后,返回新的指向原来位置的迭代器。解释:迭代器指向12345中的4,删除了4后5前移到4的位置,返回的迭代器指向5
    8.     }else
    9.     {
    10.        it2++;
    11.     }
    12. }
    复制代码
    }

    [/code]
  • 如果一个类中重写了operator()运算符重载函数,那使用该类创建的对象称作函数对象,或者仿函数。这类对象可以调用函数的方式使用,而这样使用时实质是调用对象中的operator()运算符重载函数。
  • 重要的作用的是替换C语言中的函数指针,函数对象(也称为functor)和函数指针都是回调机制的实现方式
  • 利益

    • 通过函数对象调用operator(),可以省略函数的调用开销,比通过函数指针调用(不能够inline内联调用)函数效率高。
    • 因为函数对象是用类生成的,以是可以添加干系的成员变量,用来记载函数对象使用时的信息

  • 实例
    1. class greator{public:    bool operator()(const int a, const int b)const    {        return a>b;    }};  // 函数对象的类int main() {
    2. using namespace std;
    3. priority_queue pque1;  // 默认的优先级队列
    4. priority_queue pque2;  // 通过模版中使用函数对象类改变优先级队列
    5. [code]for(int i=0; i<20; i++){    pque1.push(rand()%100+1);    pque2.push(rand()%100+1);}auto length = pque1.size();for(int i=0; i<length; ++i){    cout<<pque1.top()<<' ';    pque1.pop();}cout<<endl;for(int i=0; i<length; ++i){    cout<<pque2.top()<<' ';    pque2.pop();}cout<<endl;// 删除偶数
    6. auto it2 = vec.begin();
    7. while(it2!=vec.end())
    8. {
    9.     if(*it2%2 == 0 )
    10.     {
    11.         it2 = vec.erase(it2);  //更新迭代器。 erase删除迭代器指向的元素后,返回新的指向原来位置的迭代器。解释:迭代器指向12345中的4,删除了4后5前移到4的位置,返回的迭代器指向5
    12.     }else
    13.     {
    14.        it2++;
    15.     }
    16. }
    复制代码
    }

    [/code]
    1. // 插入方式
    2. unordered_map<int, string> map1;
    3. map1.insert(make_pair(1, "aaa"));
    4. map1.insert({2, "bbb"});
    5. map1[3] = "ccc";
    6. // map1 = {
    7.         {1, "aaa"},
    8.         {2, "bbb"},
    9. }
    复制代码
五、泛型算法

C++的泛型算法是C++尺度模板库(STL)中的一部分,它们是一组独立于任何特定容器的函数模板,可以在任何类型的容器上操作。泛型算法的核心思想是算法与数据容器分离,算法不依靠于容器的具体实现,而容器也不依靠于特定的算法。

  • 泛型算法的重要特点

    • 模板化:泛型算法通过模板参数接受任何类型的迭代器,使其能够适用于各种容器。
    • 迭代器依靠:算法的操作仅依靠于迭代器,不依靠于容器的具体类型。
    • 类型无关性:算法不关心容器中元素的具体类型,只关心元素可以被迭代器访问和操作。

  • 头文件:#include
  • 泛型算法的吸收的参数是迭代器和函数对象
  • 常见的泛型算法:

    • sort:对迭代器范围内的元素进行排序。
    • swap:交换两个元素位置
    • find:查找迭代器范围内第一个符合特定条件的元素。
    • find_if:查找迭代器范围内满足if条件的元素
    • copy:复制迭代器范围内元素到另一个容器。
    • shuffle:打乱迭代器范围内元素顺序
    • binary_search:在迭代器范围内二分查找一个元素
    • reverse:反转迭代器范围内元素
    • min:返回迭代器范围内最小值
    • max:返回迭代器范围内最大值
    • for_each:遍历迭代器范围内元素,并可以传入一个函数对象处理这个元素

  • 补充:

    • 非修改算法

      • std::find:查找第一个符合特定条件的元素。
      • std::count:盘算某个值在范围内出现的次数。
      • std::search:搜索子序列。

    • 修改算法

      • std::copy:复制元素到另一个容器。
      • std::fill:将某个值赋给一定范围内的所有元素。
      • std::replace:替换范围内所有符合特定条件的元素。

    • 排序和干系算法

      • std::sort:对范围内的元素进行排序。
      • std::partial_sort:部分排序,确保范围的前N个元素是整个范围中最小的N个元素。
      • std::nth_element:确保第N个位置的元素放置在排序后它应该在的位置。

    • 集合算法

      • std::set_union:盘算两个集合的并集。
      • std::set_intersection:盘算两个集合的交集。
      • std::set_difference:盘算两个集合的差集。

    • 配对算法

      • std::mismatch:查找两个序列中第一个不匹配的元素。
      • std::equal:检查两个序列是否相等。

    • 算术和数学算法

      • std::accumulate:盘算范围内所有元素的总和。
      • std::inner_product:盘算两个序列元素的内积。
      • std::transform:对范围内的每个元素应用给定的函数。

    • 容器修改算法

      • std::erase:从容器中删除元素。
      • std::remove:从序列中移除符合特定条件的元素。
      • std::unique:移除序列中一连重复的元素。

    • 查找和搜索算法

      • std::binary_search:在已排序的范围内进行二分查找。
      • std::lower_bound:有序的情况下,找到大于即是给定值的第一个元素。使用二分查找
      • std::upper_bound:有序的情况下,找到大于给定值的第一个元素。使用二分查找
      • std::lower_bound和std::upper_bound的区别:
        1. template<class A, class B>
        2. struct pair
        3. {
        4.         A first;  // KEY
        5.         B second;  // VALUE
        6. {
        复制代码
        index1的值为1,即nums中第一个2的下标;index2的值为4,nums中3的下标,也是第一个大于2的元素的下标。




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表