算法竞赛C++常用STL知识小结

一、string

  • 初始化:

    1. 直接赋值:string s = "Hello Standard Library";
    2. 给定长度并为所有元素赋初值:string s(8, 's');
  • 常用操作:

    • 字符串拼接、比较:+,+=,<,>运算符,比较也可用compare(另一个字符串)
    • 获取长度:length()
    • 判空:empty()
    • 截取子串:substr(起始位置, 偏移量)
    • 替换:replace(起始位置, 偏移量, 要替换子串)
    • 删除:erase(起始位置, 偏移量)

二、vector

  • 初始化:

    1. 无参初始化:vector<数据类型> v;
    2. 给定长度:vector<数据类型> v(长度);
    3. 给定长度并为所有元素赋初值:vector<数据类型> v(长度, 初始值)
  • 常用方法:

    • 缩容扩容:resize(容量)

    • 后方插入:push_back(元素)

    • 中间插入:insert(位置, 元素)

    • 迭代器遍历:

      for(vector<int>::iterator it = v.begin(); it != v.end; i++) {
          // vector<int>::iterator 可换为 auto
          cout << *it << endl;
      }
      
    • 下标遍历:

      for(int i = 0; i < v.size(); it++) {
          cout << v[i] << endl;
      }
      
    • 清空:clear()

三、set

集合,set里面的元素不能重复,会按从小到大排序

  • 初始化:set<int> s;

  • 常用方法:

    • 向集合中添加元素:insert(元素)

    • 查找集合中某元素:find(元素)

      if(s.find(某元素)= s.end()) {
          //找到元素
      } else {
          //未找到元素
      }
      
    • 迭代器遍历:

      for(auto it = s.begin(); it != s.end(); it++) {
          cout << *it << endl;
      }
      
    • 清空:clear()

四、map

map会自动将所有键值对从小到大排序,底层数据结构是红黑树

  • 初始化:

    1. 创建一个空map:map<键类型, 值类型> m;
    2. 初始化并赋初值:map<键类型, 值类型> m = {{键1, 值1}, {键2, 值2}};
  • 常用方法:

    • 添加/修改元素:map[键] = 值

    • 查找某元素是否存在:count(“键”) != 0

    • 迭代器遍历:

      for(auto it = m.begin(); it != m.end(); it++) {
          cout << it->first << endl;//输出键
          cout << it->second << endl;//输出值
      }
      
    • 清空:clear()

五、stack

栈,后进先出

  • 初始化:stack<元素类型> stack;
  • 常用方法:
    • 压栈:push(元素)
    • 出栈:pop()
    • 查看栈顶:top()
    • 查看长度:size()
    • 是否为空:empty()
    • 清空:clear()

六、queue

队列,先进先出

  • 初始化:queue<元素类型> queue;
  • 常用方法:
    • 入队:push(元素)
    • 出队:pop()
    • 查看队首:front()
    • 查看队尾:back()
    • 查看长度:size()
    • 是否为空:empty()
    • 清空:clear()

七、algorithm

算法头文件

  • 常用方法:
    • 求最大值、最小值、绝对值:max(数字1, 数字2)、min(数字1, 数字2)、abs(整数)
    • 交换位置:swap(参数1, 参数2)
    • 反转两迭代器之间的元素顺序:reverse(迭代器1, 迭代器2)
    • 填充:fill(起始位置, 结束位置, 元素)
    • 排序:sort(起始位置, 偏移量, [比较器])
    • 二分查找第一个大于等于给定元素的地址,需要先排序
      int pos = lower_bound(起始位置, 结束位置, 给定元素) - 起始位置;
    • 二分查找第一个大于给定元素的地址,需要先排序
      int pos = upper_bound(起始位置, 结束位置, 给定元素) - 起始位置;
    • 转为字符串:to_string(数字)
    • 字符串转整型数:stoi(字符串)
    • 字符串转浮点数:stod(字符串)

八、迭代器

迭代器可以访问顺序容器和关联容器中的元素。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

  • 迭代器定义方式分类:

    迭代器类型写法
    正向迭代器容器类名::iterator 迭代器名;
    常量正向迭代器容器类名::const_iterator 迭代器名;
    反向迭代器容器类名::reverse_iterator 迭代器名;
    常量反向迭代器容器类名::const_reverse_iterator 迭代器名;
  • 迭代器用法:

    迭代器都可以进行++操作。反向迭代器和正向迭代器的区别在于:

    • 对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;
    • 而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。

    通过迭代器可以读取它指向的元素,*迭代器名就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。

    注意,容器适配器 stack、queue 和 priority_queue 没有迭代器。容器适配器有一些成员函数,可以用来对元素进行访问。

  • 迭代器功能分类:

    1. 正向迭代器。假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==!=运算符进行比较;

    2. 双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则--pp--都是有定义的。--p使得 p 朝和++p相反的方向移动;

    3. 随机访问迭代器。随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:

      • p+=i:使得 p 往后移动 i 个元素。
      • p-=i:使得 p 往前移动 i 个元素。
      • p+i:返回 p 后面第 i 个元素的迭代器。
      • p-i:返回 p 前面第 i 个元素的迭代器。
      • p[i]:返回 p 后面第 i 个元素的引用。

      此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。p1<p2的含义是:p1 经过若干次(至少一次)++操作后,就会等于 p2。其他比较方式的含义与此类似。

      对于两个随机访问迭代器 p1、p2,表达式p2-p1也是有定义的,其返回值是 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减1)。

  • 不同容器的迭代器的功能

    容器迭代器功能
    vector随机访问
    deque随机访问
    list双向
    set / multiset双向
    map / multimap双向
    stack不支持迭代器
    queue不支持迭代器
    priority_queue不支持迭代器
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值