C++ 模板库 STL -优先队列,哈希表,栈,队列 -vector,queue,stack,priority_queue,unordered_map

STL标准模板库学习

Vector

  • 定义
vector<int>array;
vector<vector<int>>array;
vector<struct SelfDef>array;
  • 访问
    1. 下标访问
    vector<int>array;
    array.push_back(0);
    array[0];
    
    1. 迭代器访问
    vector<int>array;
    array.push_back(0);
    for(vector<int>::iterator it=array.begin();it!=array.end();it++){
        cout<<*it<<endl;
    }
    
  • 一些函数
    • push_back()
      O ( 1 ) O(1) O(1)
    • pop_back()
      O ( 1 ) O(1) O(1)
    • size()
      O ( 1 ) O(1) O(1)
    • clear()
      O ( n ) O(n) O(n)
    • insert()
      O ( n )   o r   O ( 1 ) O(n)\ or\ O(1) O(n) or O(1)
      vector<int>array;
      array.push_back(0);
      array.insert(array.begin(),1);
    
    • erase()
      • 删除指定位置元素
        array.erase(array.begin());
        
      • 删除一个区间内元素
        array.erase(array.begin(),array.begin()+array.size());
        

Set

  • 定义
    set<int>s;
    

    定义的变量可以时普通类型,可以是vector,set,queue

  • 访问
    仅可以通过迭代器访问
    set<int>s;
    for(set<int>::iterator it=s.begin();it!=s.end();it++){
      cout<<*it<<' ';
    }
    
  • 常用函数
    • insert(element)
      insert会自动对插入的元素进行排序(自动递增)
      O ( log ⁡ ( n ) ) O(\log(n)) O(log(n))
    • find(element)
      O ( l o g ( n ) ) O(log(n)) O(log(n))
      • 返回一个set中的迭代器
      //判断是否含有此元素
      if(set.find(element)!=set.end()){
        ...
      }else{
        ...
      }
      
    • erase
      • 删除单个
        • 通过迭代器
          O ( 1 ) O(1) O(1)
        set<int>iterator it;
        set.erase(it)
        
        • 通过元素
          O ( log ⁡ ( n ) ) O(\log(n)) O(log(n))
        set.erase(100)
        
      • 删除区间
      set.erase(set.begin(),set.end())
      

Unordered_set

  • 定义
    unordered_set<int>ust;
    

    可以是任何类型的键,与set类似

  • 其余使用与 set 类似

Unordered_map

  • 定义
    unordered_map<key_type,value_type>um;
    

    支持所有的类型,但是对于一些自定义或者预定义类型(如vector)需要完善哈希函数以及对应的相等性的判断

  • 常用函数
    • 时间复杂度均为
      O ( 1 ) − > O ( n ) O(1)->O(n) O(1)>O(n)
    • at(key)

      返回key对应值的引用

      unordered_map<string,int>um;
      um["wx"]=0621;
      um.at("wx")=1412;
      cout<<um["wx"];
      

      将输出1412

    • begin()/end()
      • 返回迭代器
    • erase()
      um["wx1"]=1412;
      um.erase("wx1");
      if(um.find("wx1")==um.end()){
          cout<<"delete wx1"<<endl;
      }
      
      • 其中也可以仿照set利用迭代器删除元素
    • find()
    • empty()
      • 返回一个bool值

Queue

  • 定义
    queue<type>q
    
  • 常见函数
  1. push():将元素压入队列尾部

    • 时间复杂度:均摊 O(1)
  2. pop():将队首元素从队列中移除

    • 时间复杂度:O(1)
  3. front():访问队首元素

    • 时间复杂度:O(1)
  4. back():访问队尾元素

    • 时间复杂度:O(1)
  5. empty():检查队列是否为空

    • 时间复杂度:O(1)
  6. size():返回队列中元素的个数

    • 时间复杂度:O(1)

Stack

  • 定义
    stack<type>sk;
    
  • 常见函数
  1. push():将元素压入栈顶

    • 时间复杂度:均摊 O(1)
  2. pop():将栈顶元素弹出栈

    • 时间复杂度:O(1)
  3. top():访问栈顶元素

    • 时间复杂度:O(1)
  4. empty():检查栈是否为空

    • 时间复杂度:O(1)
  5. size():返回栈中元素的个数

    • 时间复杂度:O(1)

priority_queue

包含头文件

#include <queue>

创建优先队列

std::priority_queue<int> pq; // 创建一个存储整数的默认最大优先队列

插入元素

pq.push(10); // 向优先队列中插入元素 10
pq.push(20); // 向优先队列中插入元素 20

访问顶部元素

int topElement = pq.top(); // 获取优先队列中的顶部元素(具有最高优先级)

删除顶部元素

pq.pop(); // 从优先队列中删除顶部元素

自定义比较函数

如果需要自定义元素的比较方式,可以传入自定义的比较函数作为模板参数,或者重载元素类型的 < 操作符。

例如,创建一个最小堆(最小值优先)的优先队列:

std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

或者自定义结构体并重载 < 操作符:

struct Node {
    int val;
    int priority;
    bool operator<(const Node& other) const {
        return priority > other.priority; // 自定义比较规则
    }
};

std::priority_queue<Node> customQueue;

注意事项

  • std::priority_queue 默认情况下是最大堆(最大值优先),如果需要最小堆,可以传入第三个模板参数为 std::greater<T>
  • 优先队列的元素没有随机访问的能力,只能操作顶部元素和插入/删除操作。
  • 29
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值