高中只是听说过stl,每次问老师老师都会说“有毒,千万别学”,于是stl有毒的言论深深的印在我脑海,看到就恐惧,于是一直没有学,但是大学后确实很多用到stl的地方必须去学习了。
现在想想老师当年的说法是可以理解的,相传stl速度上有所欠缺(与自己手写的数据结构作比较),毕竟OI的赛制比拼的不是时间,而是效率,同样的策略,使用stl可能就比使用自己写的数据结构少过一个测试点,一个测试点有多重要我是最清楚的2333往事不堪回首。
但是ACM不太一样,时间变得十分的宝贵,简单的题目直接上stl可能三分钟写完,自己手写要半个点,人与人就拉开差距了,难题一般都需要对高级数据结构进行定制,stl大家都用不上,不用太担心效率的问题。
下面进入正题
=======================
vector 是类似数组的存在,不过他是动态数组,在不确定数据量大小的时候十分好用
初始化
vector<int> nums;
vector<int> mynums(nums);
vector<int> rows(m,0);
vector<vector<char>> picture; //二维
int x=mynums.size();
插入&取出
nums.push_back(1);
int x=nums.pop_back();
遍历
for(int i=0;i<num.size();i++)
nums[i];
for(vector<int>::iterator it=nums.begin();it!=nums.end();it++)
cout<<*it;
===============================
unordered_map 是一个hash实现的映射(可以携带辅助数据)
===============================
unordered_set 是一个hash实现的数据存储器,快速判断数据存在性
===============================
set 是红黑树,logn的查找插入删除
默认的是左小右大,所以呢.begin是最小值,.rbegin是最大值
初始化
set<int> s;
插入&删除
s.insert(5);//会返回一个pair,first是迭代器,second是bool表示是否成功
s.erase(2);
s.clear();
遍历(中序遍历)
类似于vector
还可以反向遍历,用reverse_iterator
查找(返回迭代器,如果没找到,返回s.end())
it=s.find(5);
x=*it
摘自别人的博客,还没有测试,不理解为什么自定义比较规则要重载一对小括号。。。
http://blog.csdn.net/wangran51/article/details/88361606.自定义比较函数
(1)元素不是结构体:
例:
//自定义比较函数myComp,重载“()”操作符
struct myComp
{
bool operator()(const your_type &a,const your_type &b)
[
return a.data-b.data>0;
}
}
set<int,myComp>s;
......
set<int,myComp>::iterator it;
(2)如果元素是结构体,可以直接将比较函数写在结构体内。
例:
struct Info
{
string name;
float score;
//重载“<”操作符,自定义排序规则
bool operator < (const Info &a) const
{
//按score从大到小排列
return a.score<score;
}
}
set<Info> s;
......
set<Info>::iterator it;
===============================
map 是二叉树,带有映射关系
===============================