以RB-tree为底层机制的几个关联式容器

1、set

set的键值就是实值,实值就是键值。所以set不可以通过迭代器改变其元素值,它的迭代器都是被定义成const_iterator。

set是以RB-tree为底层机制的,它的大部分操作都只是转调用RB-tree的操作而已。(默认按照升序排列)

用法: 

int  num[]={5,7,3,2,4,4,5};
    set<int>iset(num,num+7);//set会自动排序并删除重复元素:2,3,4,5,7
    int t1=iset.count(2);  //可以用来判断是否有这个元素,有为1,否则为0
    cout<< t1<<endl;
    set<int>::iterator t2=iset.begin();
    t2=iset.find(2);
    if(t2!=iset.end())
        cout<<"find 2"<<endl;
    pair<set<int>::iterator,set<int>::iterator>iter=iset.equal_range(4);
    cout<<* iter.first<<endl;
    cout<< *iter.second<<endl;

注意:set与vector区别:set是有序且不重复的元素序列,set不可以随机取数,不能有[]操作。

 

2、map

map同时拥有键值和实值,所有元素会自动根据元素的键值排序。第一元素键值第二元素实值。同样map的迭代器不能修改元素的键值,但可以改变实值。它也不允许键值重复。结构如下:

template<class T1,class T2>
struct pair{
typedef  T1 first type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1),second((T2())){}
pair(const T1&a,const T2& b):first(a),second(b){}
};

map的用法:

map<int ,string>name;
    name[3]="c";
    name[2]="b";
    name[1]="a";
    pair<int,string> value(4,"d");
    name.insert(value);
    map<int ,string>::iterator iter_name=name.begin();
    for(;iter_name!=name.end();++iter_name)
        {
        cout<<iter_name->first<<' '<<iter_name->second<<endl;
        cout<<(*iter_name).first<<' '<<(*iter_name).second<<endl;
        }

输出:

1 a

1 a

2 b

2 b

3 c

3 c

4 d

4 d

 

3、multiset、multimap

multiset与set只有一点不同,multiset允许键值重复,它的底层是采用insert_equal() 而非insert_unique()

multimap与map只有一点不同,multiset允许键值重复,它的底层是采用insert_equal() 而非insert_unique()

 

posted on 2016-03-23 09:09  RenewDo  阅读(245)  评论(0编辑  收藏  举报

导航