C++:标准模板库STL(Standard Template Library):
写在前面:最近刷题的时候总是会遇见使用STL轻松解决的好家伙,所以用这篇文章来总结一下自己遇到的常用的ST了方法。持续更新中,用到就来完善一下这篇博文。
正文开始:
STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,可以用于完成诸如排序、 输入/输出、数学计算等常见功能的复用,进行泛型编程。
以下每一个都已经被写成了类进行了封装,我们可以直接使用, 可以按照不同的组件需求加入以下头文件:
或者直接加入万能头文件:#include<bits/stdc++.h>
,这个头文件详情可以点击如何将力扣的C++代码在自己的编译器上运行?(力扣的输入输出)学习一下。
一、 向量vector:(类似于数组的数据结构)
vector是序列容器,是一种占用连续内存地址的数据结构,这使得vector可以通过下标访问元素。可以把这个东西看做是一个可以在末尾插入元素的动态数组,当空间大小不够时,可以自动扩增,每次扩增大小为50%,将原先数据复制后释放原内存。
常用的向量类函数原型如下:(为了方便复制,本文常见的函数都会使用采用代码块写)
//-----定义------数组名字以nums为例
vector<类型>数组名字(数组大小,初始化值); //一维数组定义概念,其中最后的括号里的数组大小、初始值可以省略,
eg:
1、vector<int>nums(10,0);
2、vector<int>nums(10);
3、vector<int>nums;
vector<vector<int>>nums(m,vector(n,0)); //和一维类似,二维vector的定义
//---返回值
nums.begin(); //返回向量第一个元素为迭代器开始
nums.end(); //返回向量最后一个元素为迭代器结束
nums.size(); //返回数组大小
nums.front(); //数组开头的值
nums.empty(); //判断数组是否为空
//----操作---
nums.push_back(n); //末尾插入n
nums.pop_back(); //删除末尾
nums.insert(pos,n,x) //从pos开始插入n个x
nums.clear(); //清空数组
sort(nums.begin(),nums.end()); //数组从小到大排序,复杂度O(nlogn)
reverse(nums.begin(),nums.end()); //翻转整个数组,可以和上一个结合实现从大到小排序
nums.erase(pos); //移除pos位置的值
拷贝nums到nums2:
1)vector<int> nums2(nums);
2)vector<int>nums2;
nums2.assign(nums.begin(),nums.end());//assign代表用新元素替换原有内容。
3)vector<int> nums2;
nums2.swap(nbms);//swap代表交换两个容器的所有元素
4)遍历数组,依次插入:略
二、栈stack:一种先进后出的数据结构(FILO)
栈是容器适配器,也会被我戏称为一种先进后厨的数据结构。栈的主要操作是栈顶(尾部)进行出栈入栈。
//----定义---
stack<类型>栈名;
eg: stack<int>st;
//---返回值---
st.size(); //返回栈的大小
st.empty(); //返回栈是否为空
st.top(); //栈顶的值
//---操作
st.push(x); //进栈
st.pop(x); //x出栈
三、队列queue:一种先进先出的数据结构
队列是容器适配器,在队头删除,队尾插入。
//----定义队列---
queue<类型>名队列字
eg:queue<int>q;
//------返回值----
q.empty();
q.size();
q.front();
q.back();
//-----操作---
q.push(x); //入队
q.pop(x); //出队
四、列表list(序列容器、线性表)
列表是序列容器,是一个相同特征的数据元素的有限序列,可以在任意位置插入删除。
//-----定义--
list<数据类型>列表名字;
eg:list<int> l;
//-----返回值----
l.begin();
l.end();
l.empty();
l.front();
l.back();
l.push_front();
l.pop_front();
l.push_back();
l.pop_back();
l.insert(pos,n,x) //从pos处插入n个x元素值
l.clear();
l.remove(x); //删除列表中的X值
l.unique(); //删除列表重复值
l.reverse(); //翻转列表
l.sort();
五、set
set 是关联容器,用于快速存取唯一的关键字。插入重复值,就会忽略这个值。
六、map
map是关联容器,又叫关联数组,用于快速存取唯一的关键字和关联值,也就是哈希表。
看完就懂的使用案例:剑指offer 03.数组中的重复数字
七、算法:
sort(); //排序
find(); //返回第一个满足()内条件的下标,或者没找到
find_if(); //返回 第一个满足()内条件的下标
binary_searrch(); //是否存在某个值
swap( , ); //交换两个数、数组......
merge(); //合并数组(要求排序)
unique(); //降重(要求排序)
make_heap(); //创建堆排序
sort_heap();
push_heap();
pop_heap();
*max_element();
*min_element();
未完待续…