zoukankan      html  css  js  c++  java
  • 7.7 C++基本关联式容器

    参考:http://www.weixueyuan.net/view/6404.html

    总结:

      基本的关联式容器主要有:set、multiset、map和multimap,这四种容器可以分为两组:map和set。   

      set可以理解为我们数学中的集合,它可以包含0个或多个不重复、不排序的数据,这些数据被称为键值。

      map也是一种集合,它同样可以包含0个或多个不排序的元素对,每一个元素对有一个键值和一个与键值相关联的值,在map中键值是不允许重复的。

      而multiset则是允许重复的集合,multimap则是允许有重复键值的map,因为multiset和multimap可以看做是set和map的扩展,因此我们将主要介绍set和map。

      对于set容器,insert被重载过,其调用方式有两种,但是无论以哪种方式进行调用,insert函数都能保证插入元素后set容器中不会出现重复的元素。

      find函数可以用于查找set容器中是否包含指定的键值,如果存在,则返回指向该键值的迭代器,如果不存在,则返回与end()函数相同的结果。

      map是一种关联式的列表,即将一个键值与一个值一一对应起来。

      键值在map中是不允许出现重复的,但是与键值对应的值value可以出现重复。如果键值出现相同,则以最后一次出现的作为结果。 

      map容器则需要通过itor->first访问键值,并用itor->second访问与键值对应的值。

    --------------

    基本的关联式容器主要有:set、multiset、map和multimap,这四种容器可以分为两组:map和set。   

    set可以理解为我们数学中的集合,它可以包含0个或多个不重复、不排序的数据,这些数据被称为键值map也是一种集合,它同样可以包含0个或多个不排序的元素对,每一个元素对有一个键值和一个与键值相关联的值,在map中键值是不允许重复的。而multiset则是允许重复的集合,multimap则是允许有重复键值的map,因为multiset和multimap可以看做是set和map的扩展,因此我们将主要介绍set和map。

    例1:

    #include <iostream>
    #include <set>
    using namespace std;
    
    int main()
    {
        set< int > s;
        s.insert(s.begin(), 9);
        s.insert(1);
        s.insert(s.end(),4);
        s.insert(5);
        s.insert(6);
        s.insert(7);
        s.insert(9);
        s.insert(0);
        set< int >::const_iterator itor;
        for(itor = s.begin (); itor != s.end(); itor++)
            cout<< *itor<<" ";
        cout<< endl;
        itor = s.find( 2 );
        if( itor == s.end() )
            cout<< "NOT Found 2!" << endl;
        else
            cout<< "Found 2 in set!" << endl;
        itor = s.find( 5 );
        if( itor == s.end() )
            cout<< "NOT Found 5!" << endl;
        else
            cout<< "Found 5 in set!" << endl;
        return 0;
    }

    本例是set的一个示例,在主函数中我们先创建了一个set容器整型的示例s,之后就开始向容器中添加数据。对于set容器,insert被重载过,其调用方式有两种,我们既可以向前面序列式容器那样调用:

    s.insert( s.begin(), 9);
    s.insert( s.end(), 5);
    也可以不指定插入位置,而直接插入元素:
    s.insert( 6 );

    但是无论以哪种方式进行调用,insert函数都能保证插入元素后set容器中不会出现重复的元素。


    在插入一些元素之后,我们就定义了一个迭代器itor用于访问容器中的元素。访问的方法和序列式容器相同。

    find函数可以用于查找set容器中是否包含指定的键值,如果存在,则返回指向该键值的迭代器,如果不存在,则返回与end()函数相同的结果。在例1中,我们分别查找了键值2和5是否存在于集合s中,因为s容器没有2元素,因此返回值等于s.end(),存在5元素,因此查找5元素时,函数返回结果不等于s.end()。

    例2:

    #include <iostream>
    #include <map>
    using namespace std;
    
    int main()
    {
        map< char, int > m;
        m[ 'a' ] = 1;
        m[ 'b' ] = 2;
        m[ 'c' ] = 3;
        m[ 'd' ] = 4;
        m[ 'e' ] = 1;
        m[ 'f' ] = 2;
        m[ 'g' ] = 3;
        m[ 'h' ] = 4;
        m[ 'a' ] = 0;   
        map< char, int >::iterator itor;
        for(itor = m.begin(); itor != m.end(); itor++)
            cout << itor->first << " -- " << itor->second <<endl;
        return 0;
    }

    本例是一个map容器的示例程序,map是一种关联式的列表,即将一个键值与一个值一一对应起来。我们直接来看主函数,主函数一开始定义了一个map容器示例m,“map< char, int > m;”语句中char表示键值的数据类型,int表示与键值对应的值的数据类型。我们用字符来作为键值,键值在map中是不允许出现重复的,但是与键值对应的值value可以出现重复,如本例中m[ 'a' ]和m[ 'e' ]相同。但是如果键值出现相同,则以最后一次出现的作为结果,例如本例中一开始“m[ 'a' ] = 1;”,在后面又出现“m[ 'a' ] = 0;”,此时不会有语法错误,这两句可以理解为“m[ 'a' ] = 1;”是给“m[ 'a' ]”赋初值,其值为1,而“m[ 'a' ] = 0;”则可以理解为我们将“m[ 'a' ]”的值由1修改为0。


    遍历map时同样是使用迭代器,在函数中我们定义了一个迭代器itor,由于map中是由元素对组成的,包含两个元素,因此遍历方法与前面所介绍的容器稍有不同,前面的容器用*itor就可以直接获得所需要的元素,而map容器则需要通过itor->first访问键值,并用itor->second访问与键值对应的值。

    例2最终运行结果如下:
    a–– 0
    b –– 2
    c –– 3
    d –– 4
    e –– 1
    f –– 2
    g –– 3
    h –– 4

  • 相关阅读:
    通过HttpListener实现简单的Http服务
    WCF心跳判断服务端及客户端是否掉线并实现重连接
    NHibernate初学六之关联多对多关系
    NHibernate初学五之关联一对多关系
    EXTJS 4.2 资料 跨域的问题
    EXTJS 4.2 资料 控件之Grid 那些事
    EXTJS 3.0 资料 控件之 GridPanel属性与方法大全
    EXTJS 3.0 资料 控件之 Toolbar 两行的用法
    EXTJS 3.0 资料 控件之 combo 用法
    EXTJS 4.2 资料 控件之 Store 用法
  • 原文地址:https://www.cnblogs.com/yongpan/p/7966751.html
Copyright © 2011-2022 走看看