C++ Primer笔记(10) 关联容器(1)

parir类型

   #include <utility>

 

    pair类型所提供的操作:

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

    pair<T1,T2> p1(v1,v1);  创建一个pari对象,它的两个元素分别是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, 则返回true

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

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

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

pair的创建和初始化

  创建pair对象时, 必须提供两个类型名

    pair<string, string> anon;
    pair<string, int> word_count;
    pair<string, vector<int> > line;

   创建未始始化,则调用默认构造函数对其成员采用值初始化。

    pair<string,string> author("James","Joyce")

如果需要定义多个相同的pair类型对象,可用typedef简化其声明:

   typedef pair<string,string> Author;

   Author proust("marcel","proust");

   Author joyce("james","joyce");

对pair对象的操作:可直接访问其数据成员,其成员都是公有的,分别命名为first和second,只需使用普通的点操作符。

   string firstBook;
    if(joyce.first == "James" && joyce.second == "Joyce")
        firstBook = "Setphen Hero";

生成新的pair 对象:标准提供make_pair对象,传递给它两个实参生成一个新的pair对象。

    pair<string,string> next_auth;

    string first, last;

    while(cin >> first >> last) {

         next_auth = make_pair(first,last);

    }

 

关联容器

关联容器共享大部分非全部的顺序容器操作。关联容器不提供front,push_front,pop_front,back,push_back,pop_back操作。

在迭代器关联容器时,我们可以确保键的顺序访问元素,而与元素在容器中的存放位置完全无关。

map类型

map是键-值(key-value)对的集合。map类型通常可理解为关联数组:可使用键作为下标来获取一个值。

map对象的定义:

   要使用map对象,则必须包含map头文件。

   #include <map>

 

   定义时必须指明键和值的类型:

   map<string,int> word_count;

   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>

   对于键类型,唯一的约束就是必须支持<操作符,到于是否支持其它的关系或相等运算,则不作要求。

 

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>::mappend_type类型

 

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

eg:

    map<string, int> word_count;
    word_count["Anna"] = 1;
    map<string,int>::iterator map_it = word_count.begin();
    cout << map_it->first;
    cout << " " << map_it->second;
    ++map_it->second;

 

给map添加元素

使用下标访问map对象

  eg:

     map <string,int> word_count;

     word_count["Anna"] = 1;

所查找的键不存在时,map容器才为该键创建一个新的元素,并将它插入到些map对象中。

eg:

    map<string,int> word_count;

    string word;

    while (cin >> word)

         ++word_count[word];

 

map::insert的使用

 eg: word_count.insert(map<string,int>::value_type("Anna",1)); //inserts new element with value 1, position in first

<=> word_count.insert(make_pair("Anna",1));

<=> typedef map<string,int>::value_type valType;

       word_count.insert(valType("Anna",1));

map对象中一个给定键只对应一个元素,如果插入的元素对应键已在窗口中,则insert将不做任何操作。

 

下标操作如果键不在map容器中,会插入一个具有该键的新元素。

eg:map<string,int> word_count;

     int occurs = word_count["foobar"];  //values=0;

 

不修改map对象的查询操作

   m.cout(k)    返回m中k的出现次数

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

 

用count检查map对象中某键是否存在

eg:int occurs = 0;

     if(word_count.count("foobar"))

           occurs = word_count["foobar"];

 

读取元素而又不插入新元素

eg:int occurs = 0;

     map<string,int>::iterator it = word_count.find("foobar");

         if(it != word_count.end())

              occurs = it->second;

 

从map对象中删除元素:

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

m.erase(p)     删除p所指向的元素。返回void。

m.erase(b,e)  删除一段范围内的元素,由迭代器b和e 标记范围。返回void

 

map对象的迭代器

eg:map<string,int>::const_iterator map_it = word_count.begin();
    while(map_it != word_count.end()){
        cout << map_it->first << " occurs "
            << map_it->second << " times " << endl;
        ++map_it;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值