关于STL的一些东西
感言:
学C++不学STL函数库的人可能都是。。。
有点问题
头文件<algorithm>的一些东西
sort,快排:
这是个初学者必需掌握的东西,及其好用,因为方(lan)便(duo)。
sort(a+1,a+1+n);是最基本的,你还可以根据这个随意改变数组名称,区间范围(只要确定你需要排序数组的开头和结尾的数组的代号)
#include<iostream> #include<algorithm> using namespace std; int n; int main() { cin>>n; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); for(int i=1;i<=n;i++) cout<<a[i]; }
next_permutation与prev_permutation,不重复的全排列:
这玩意貌似没啥人知道,因为全排列可以自己打,而且STL本来就慢,但是因为方(lan)便(duo)还是挺好用的。这里介绍一下,next_permutation是按照字典序排列的全排列而prev_permutation则是逆字典序排列的。要使用这个东西,你必须确定你需要排列数组的值的
顺序!!!
例如,你用next_permutation排列(3,1,2)会得出(3,1,2);(3,2,1);
而用next_permutation排列(1,2,3)会得出(1,2,3);(1,3,2);(2,1,3);(2,3,1);(3,1,2);(3,2,1);
所以顺序很重要!!!如果你想要得出全部答案一个范围的排序,next_permutation你就从小到大来,prev_permutation你就从大到小来,值得一提的是这玩意返回值是bool类型的,偶买噶!!!;
#include<iostream> #include<algorithm> using namespace std; int n; int main() { cin>>n; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; do { for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } while(next_permutation(a+1,a+n+1)); }
lower_bounde与upper_bound,二分
这个东西也是稀奇古怪的STL,也是一个比较没用的的STL,毕竟二分可以自己打嘛。不过还是要提一下,lower_bound是在一个区间查找第一个大于等于你所指定数的数,upper_bound则是去掉等于符号->大于你所指定的数。肯定需要给个区间,但最重要的是。。。
顺序!!!
是的,一样需要顺序(别以为STL二分就不需要顺序) 是不是看起来很棒(fei)。最有毒的是这个玩意返回的是个地址,所以你还得减去个地址,真棒呵。
#include<iostream> #include<algorithm> using namespace std; int n,k,ans; int main() { cin>>n>>k; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; ans=lower_bound(a+1,a+1+n,k)-a; // ans=upper_bound(a+1,a+1+n,k)-a; cout<<ans; }
unique,去重
这个东西算是很有效的一种工具了,这个有个很大的缺陷就是它只能“消除”它左右两边的重复数字,原因是它不是“消除”,而是让后面的数字“替代”前面的重复数字,更改他们的位置。所以一般需要排完一遍序才能操作。不得不感叹,STL真的啥都给你做好了。然而这玩意又是返回地址的,真的不能理解,STL咋天天返回地址。我就不减下标了,直接用指针。
#include<iostream> #include<algorithm> using namespace std; int n,k; int main() { cin>>n; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; k=*unique(a+1,a+1+n); cout<<k<<endl; for(int i=1;i<=k;i++) cout<<a[i]<<" "; }
random_shuffle和reverse
咳咳,在LYD所著的算法竞赛——进阶指南中提到这两个是相同用法,emmmm我也不知道怎么相同用法,但确实不一样,今天就来提一下,在random_shuffle中的确就是考研人品的时候,真的随机打乱,其他真的不知道,也只能orz一下别的找处规律的大佬。而在reverse中它就是将你输入进去的数翻转一下——比如你开了a[4]的数组,那么储存在编号0的数就换与编号3的地方交换,一一对应,同样他也需要一个区域,跟sort填写方式差不多,上代码:
#include<iostream> #include<algorithm> using namespace std; int n; int main() { cin>>n; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; reverse(a+1,a+1+n); //random_shuffle(a+1,a+1+n); for(int i=1;i<=n;i++) cout<<a[i]<<" "; }
不知不觉,algorithm(STL算法)就结束了,这只是浩大的STL中微不足道(好像还挺重要的)的一个头文件,前进吧,骚年们,向着伟大的STL容器出发。
关于头文件<vector>的一些东西
vector:
我们要讲的vector,你可以把它理解成一个给你开好了的“一维自动变长合理规划空间支持随机访问的数组”(呼~呼~呼~~)
一些板栗:
vector<int>a ------这是一个一维“int”类型的数组
vector<int> a[1001]---------这是一个一维开了编号0~1000,二维自动变长的数组
sturct blablabla vector<blablabla> a//a[1001]--------同样支持结构体哟
一些板栗的正确吃法:
size和empty:
这个很好理解的吧,size表大小,就是vector到底有多长。empty表空。。。(理屈词穷),就是你懂得,返回的是一个bool类型的,表是否为空,空即为1,不空即为0.