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

  • 相关阅读:
    Eclipse导入Spring Boot项目后pom.xml出现红叉的解决办法
    ubuntu18.04中将刚下载解压的eclipse添加到启动器
    easyui datagrid设置一开始不加载数据
    Spring Boot开发八字箴言(以我过去这段时间的经验总结得到)
    Spring Boot中mybatis insert 如何获得自增id
    jquery控制一个元素是否显示
    easyui-datagrid配置宽度高度自适应
    html页面js响应回车
    Node.js ORM框架Sequelize使用示例
    Java遍历日期代码
  • 原文地址:https://www.cnblogs.com/yongpan/p/7966751.html
Copyright © 2011-2022 走看看