一些stl 小技巧

大部分都是网上总结的(滑稽)

1.一些非常实用的函数,比如说找到下一个排列的 \texttt{std::next_permutation} ,帮助有序数组去重的 \texttt{std::unique} ,线性找数组前k大的 \texttt{std::nth_element} ……

2.在 \texttt{set} 上可以二分查找,有 \texttt{set::lower_bound} , \texttt{set::upper_bound} 和 \texttt{set::equal_range} 函数。

3.vector代替queue和stack还能稍微快一些。所以不建议使用queue和stack,内置的栈和队列出奇的慢。

4.优先队列,维护数列的极大值,效率很慢,比手写二叉堆还慢不少,好像set都比它快些使用的话,主要是dijkstra的优化,用优先队列可以简化代码(但效率贼慢)。

5.nth_element(first,nth,last) 将第k大的元素放到它该放(第K个)的位置上,左边元素都小于它,右边元素都大于它.

first,last 第一个和最后一个迭代器,也可以直接用数组的位置。 
nth,要定位的第nn 个元素,能对它进行随机访问.

6. vector:

          1 .vector开辟空间是动态的,即声明时vector<int>m[1e8] 都行,最后实际大小是你push_back的大小,用多少开辟多少

          2.vector存数据时必须push_back();但当你存完了,用它里面的东西时,直接可以用下标找,比如 输出时

for(int i=0;i<n;i++)
  for(int j=0;j<m[i].size();j++)
     cout<<m[i][j]

       当然最硬核的就是用迭代器了

vector<int>::iterator it;

for(it=vec.begin();it!=vec.end();it++)

    cout<<*it<<endl;

       3.常用操作: 

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(6)删除元素: vec.erase(vec.begin()+2);删除第3个元素

                       vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(7)向量大小:vec.size();

用法:  max=*(--s.end()); 

(8)清空:vec.clear();

7.  set集合

     1).set.begin() 返回集合的首迭代器,即指向集合中最小元素的迭代器,时间复杂度为O(1)

map<int>::iterator it=s.begin();
min=*it
也可以 
min=*(s.begin)

   2).set.end()

     返回集合的尾迭代器,众所周知,STL中区间都是左闭右开的,那么end()函数返回的迭代器即为指向集合中最大元素的下一    个位置的迭代器,因此--s.end()才是指向集合中最大元素的迭代器,时间复杂度为O(1)

用法:  max=*(--s.end()); 

未完待续..


 

猜你喜欢

转载自blog.csdn.net/gml1999/article/details/83627426
今日推荐