stl小记

 

非常简单浅显的东西,按理说不应该是现在的我还要学习,乃至记录的东西,但是为了避免再次忘掉,这里记录下:

 

一、set:

set和vector最大的区别在于:1、其元素不可以重复;2、内部使用红黑树,在插入元素时就已经有序,默认升序排列,可以自定义cmp使之降序,所以若自定义struct而未定义cmp,编译出错。

一个典型的set程序:

bool operator < (const c3dpoint &a,const c3dpoint &b)
{
 if(a.x!=b.x)
  return a.x if(a.y!=b.y)
  return a.y return a.z}


int main()
{
 //set 里面不会插入重复的元素
 set stda;
 cout<<"now insert some/n";
 int i;
 set::iterator  itit;
 for(i=0;i<10;++i)
 {
  stda.insert(c3dpoint(i,i,i));
  stda.insert(c3dpoint(rands(),rands(),rands()));
 }

 //find如果查找不到则会返回stda.end(), erase前注意判断
 for(int j=0;j<10;++j)
 {
  stda.erase(stda.find(c3dpoint(j,j,j))); 
 }
 for(itit=stda.begin();itit!=stda.end();itit++)
 {
  cout<<(*itit).x<<"/t"<<(*itit).y<<"/t"<<(*itit).z< }

}

还有不一样的用法:

typedef struct {

  int a,b;

  char s;

} newtype;

strcut cmp

{

 bool operator()(const newtype& a ,const newtype& b) const

{

return a.s

}

}

set sets;

newtype a,b,c;

a.a=a.b=a.s=1;

b.a=b.b=b.c=2;

c.a=c.b=c.c=3;

sets.insert(a);

sets.insert(b);

sets.insert(c);

另外注意set可以pair,感觉跟struct有点不符合,插入时默认是取pair的第一个元素来排序的,看下下面的程序:

 cout<<"pair"< vector> vvv;
 vvv.push_back(make_pair(1,1));
 cout<

 set> set1;
 set1.insert(make_pair(2,1));
 set1.insert(make_pair(1,2));
 set>::iterator it1;
 for (it1=set1.begin(); it1!=set1.end(); it1++)
 {
  cout<<(*it1).first<<"/t"<<(*it1).second< }
实验下就知道set先按pair的第一个元素排序。

 

set的常用函数:

参照网页http://apps.hi.baidu.com/share/detail/2826163

注意的是,set可以find,vector没有find,但是注意,就算vector没有find,也不要跟白痴似的自己写find(现在反省下,我都做过无数次这种傻事了),很简单,include一下algorithm:

#include
 vector> vvv;
 vvv.push_back(make_pair(14,1));
 cout< vector>::iterator vit;
 vit=find(vvv.begin(),vvv.end(),make_pair(14,1));
 cout<<"find:"<<(*vit).first<<"/t"<<(*vit).second<

set自带的函数:iterator find(const key_type& x)const;//返回索引为x的元素的指针

另外我们要注意的是:

无论是set还是vector都有insert和swap,这样对于vector就不用傻瓜似的老是push_back了

 

set另外两个值得注意的函数:lower_bound和upper_bound:

 set> set1;
 set1.insert(make_pair(2,1));
 set1.insert(make_pair(1,2));
 set1.insert(make_pair(13,2));
 set1.insert(make_pair(5,2));
 set1.insert(make_pair(7,2));
 set1.insert(make_pair(11,2));
 set>::iterator it1;
 for (it1=set1.begin(); it1!=set1.end(); it1++)
 {
  cout<<(*it1).first<<"/t"<<(*it1).second< }
 //lower_bound
 it1=set1.lower_bound(make_pair(5,2));
 cout<<"lower_bound: "<<(*it1).first<<"/t"<<(*it1).second< //upper_bound
 it1=set1.upper_bound(make_pair(5,2));
 cout<<"upper_bound: "<<(*it1).first<<"/t"<<(*it1).second<看上面的代码我们会发现一个好玩的现象 it1=set1.lower_bound(make_pair(5,2))改成 it1=set1.lower_bound(make_pair(5,4))则输出7,2,不改则输出5,2,说明在pair形式下,set元素排序是先按第一个元素排,然后按第二个元素排。

另外我们要注意lower_bound和upper_bound的含义:第一个找>=,第二个找>(特别注意这里~)

set就先讲到这里。multiset不说了

 

二、map

map虽然也有集合的特点,而且map也是红黑树结构,并且保证按序排列,但是和set的区别很大,可以用关键字直接[]。

map基本用法如下:

 cout<<"map string"< map map1;
 map::iterator mit;
 map1["afd"]="123";
 map1.insert(make_pair("456","333"));
 map1["abc"]="erd";
 map1["ads"]="456";
 cout<<"~~:"< for (mit=map1.begin(); mit!=map1.end(); mit++)
 {
  cout<<"~~:"<<(*mit).first<<"/t"<<(*mit).second< }
 mit=map1.find("ads");
 cout<<"find:"<<(*mit).first<<"/t"<<(*mit).second<

 map map2;
 map::iterator mit2;
 map2["I"]="oh";
 map2.insert(make_pair("am","ye"));
 map2["a"]="oh";
 map2["map"]="ye";
 map2["ha"]="ha";
 map2["7"]="7";
 map2["9"]="9";
 map1.swap(map2);
 for (mit=map1.begin(); mit!=map1.end(); mit++)
 {
  cout<<"map1:"<<(*mit).first<<"/t"<<(*mit).second< }

注意对set和map和全局find,如果没找到都是返回end(),所以用查找结果迭代器时要先判断下!

其他的不想写了,以后再说,要写项目了

 

 

 

你可能感兴趣的:(stl小记)