• 第十章 关联容器(上)


    在将关联容器之前,我们首先了解都得是pair类型的数据。pair类型包含两个数据值,在创建pair类型的对象时,必须要提供两个类型名。即pair对象所包含的两个数据成员各自对应的类型名字。pair类型在utility的头文件中。

    1.创建pair类型的对象:

    pair<T1,T2>p1;创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化。

    pair<T1,T2>p1(v1,v2);创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为V1,second成员初始化为V2。

    make_pair(V1,V2);以V1,V2值创建一个新的pair对象,其中元素类型分别是V1和V2的类型。

    p1<p2;两个pair对象之间的小于运算。如果p1.first<p2.first 或者 !(p2.first<p1.first)&&p1.second<p2.second,则返回ture

    p1==p2;如果两个pair对象的first和second成员一次相等,则这两个对象相等。

    p.first 返回p中名为first的数据成员

    p.second 返回p中名为second的数据成员

    2.关联容器:map,set,multimap,multiset。

    map类型:map是键-值对的集合。可以使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。

    (1)map对象的定义:

    map<k,v>m;创建一个名为m的空map对象,其键和值的类型分别是K和V

    map<k,v>m(m2);创建m2的副本m,m与m2必须有相同的键类型和值类型

    map<k,v>m(b,e);创建一个map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本。元素的类型必须能转换或者是pair<const K,V>

    建类型的约束:在使用关联容器时,它的键不但有一个类型,而且还有一个相关的比较函数。默认情况下,标准库使用键类型定义的<操作符来实现键的比较。

    (2)map定义的类型

    map<k,v>::key_type 在map容器中,用做索引的键的类型

    map<k,v>::mapped_type 在map容器中,用做键关联的值的类型

    map<k,v>::value_type 一个pair类型,它的first元素具有const map<k,v>::key_type类型,而second元素则为map<k,v>::mapped_type类型

    map迭代器进行解引用将产生pair类型的对象:如:

    map<string,int>imap;

    map<string,int>::iterator iter=imap.begin();

    cout<<iter->first<<" "<<iter->second<<endl;

    ++iter;

    3.给map容器添加元素:

    在定义了map容器之后,下一步就是要添加元素了,map容器添加元素的方法主要有两种:一、采用下标的方法。二、利用插入(insert)

    一、下标法:

    map<string,int>imap;                                   map<string,int>imap;

    imap["liujiyu"]=1;                                         string word;

                            while(cin>>word)

                               ++imap[word];

    下标法主要是通过相应的键来获取所关联的值,如果容器当中没有该键,则map将以该键以及该键所关联的值重新创建一个新的元素,并将它插入到map对象中。如果该键存在map容器中,则下标操作跟vector下标操作相同。

    二、利用插入(insert)

    map容器的insert成员。主要有以下几种形式:

    m.insert(e);    e是一个用在m上的value_type类型的值,即pair类型。如果(e.first)不在m中,则插入值为e.second的新元素;如果该键在m中已存在,                                 则保持m不变。 并且该函数返回一个pair类型对象,包含指向e.first的元素的map的迭代器和一个bool类型的对象,表示是否插入了该元素。

    m.insert(beg,end);   beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的键-值对。

    m.insert(iter,e);   e是一个用在m上的value_type类型的值,如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返                                    回一个迭代器,指向m中具有给定键的元素。

    例如:map<string,int>eords;

    string word;

    while(cin>>word)

    {pair<map<string,int>::iterator,bool> it=words.insert(make_pair(word,1));

    if(!it.second)++it.first->second;}

    4.查找并且读取map中元素

    m.count(k) 返回m中k出现的次数(这个k就是键)

    m.find(k)  如果m容器中存在按k索引的元素,则返回指向钙元素的迭代器,如果不存在,则返回超出末端迭代器

    5.map对象中删除元素:与插入操作类似

    m.erase(k);  删除m中键位k的元素,返回size_type类型的值,表示删除的元素个数

    m.erase(p);  从m中删除迭代器p所指向的元素。p必须指向m中确定存在的元素,而且不能等于m.end()。返回void类型。

    m.erase(b,e);  从m中删除一段范围内的元素,该范围有迭代器对b和e标记。b和e必须标记m中的一段有效范围。返回类型为void

  • 相关阅读:
    nexus配置yum私有仓库
    通过Kubeadm升级Kubernetes集群
    K8s容器网络如何实现通信?
    文件与目录的默认权限与隐藏权限(转)
    ”十六“进制查看器(转)
    常用的文件和目录操作命令(转)
    改变文件属性与权限(转)
    Linux目录规范和含义(转)
    文件的属性
    所有者,群组,其他人
  • 原文地址:https://www.cnblogs.com/ljy2013/p/3306538.html
Copyright © 2020-2023  润新知