C++的map和set

C++中的set 和 multiset

     set 和 multiset 会根据特定的排序准则将元素进行自动排序。(例如平衡树)


    set 和multiset不保存键值,其本身的值就是键值。 set与map的接口几乎完全相同,set没有提供operator[ ]运算符重载。


    set和multiset中最好将迭代器设置为 const_iterator,这样就无法通过迭代器进行修改set和multiset的元素。虽然STL标准中并没有规定不准修改set元素,但这样做会使set和multiset顺序遭到破坏。

    set中添加的元素类型必须重载<操作符用来排序。定义的规则根据重载的operator<来决定。

    一般排序满足以下准则:(当然也可以自定义)
        1、非对称,若A<B为真,则B<A为假。
        2、可传递,若A<B,B<C,则A<C。
        3、A<A永远为假。

    set中判断元素是否相等:
        if(!(A<B || B<A)),当A<B和B<A都为假时,它们相等。




int main(void)

{

    set<int> s;

    set<int>::iterator i;

    int tmp;

    while(cin>>tmp)

        s.insert(i);

    for ( i=s.begin() ; i != s.end() ; ++i)

        cour<<* i <<endl;

}


C++中的map和multimap


    map和multimap将key和value组成的pair作为元素,根据key的排序准则自动将元素排序,map中元素的key不允许重复,multimap可以重复。

    因为是排序的,所以map中元素的key不能被修改,只能删除后再添加。key对应的value可以修改。

    map和multimap 会根据特定的排序准则对元素的键值进行自动排序。(例如平衡树)

    向map中添加的元素的key类型必须重载<操作符用来排序。排序与set规则一致。

    取map的值时,不能直接获取指定的值。要获取指定的键对应的值时,要使用second字段。

        map<int ,date> m

        map<int,data>:: iterator i;

        i = map.begin();

        i->second.getVal();  // 取值 (data对象有getVal方法)


特性:

     1. insert()方法有个好处,会自动判断是否重复。

            datamap.insert ( { 1, Date(12 ) } );

            set.insert(i);


       2.operator[ ]  (仅针对map,multimap没有定义此运算符) 键和值是分别指定的。而且operator[ ] 总是会成功。

如果给定的键没有对应的元素值,就会创建对应键的新元素。

                datamap[ 1 ] = 12; 

        3.map和set都可以双向遍历。



你可能感兴趣的:(C++,c,map,set,STL)