STL—— 关联容器

1、关联容器与顺序容器的本质区别

     关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。

2、关联容器的类型

     map 、set、multimap、multiset

3、pair类型

     pair类型的比较:

     p1<p2 :两个pair对象之间的小于运算,其定义遵循字典次序:如果p1.first < p2.first 或者 !(p1.first < p2.first) && (p1.second< p2.second),则返回true;

    p1 == p2: 如果两个pair对象的first和second成员依次相等,则这两个对象相等,(该运算使用其元素的==操作符)

4、map类型

map<k, v> m; //创建空的map对象,其键和值得类型分别为k和v;

map<k, v> m(m2);

map<k, v> m(b,e);

注意:键值应能够比较

 

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的value_type是pair类型,它的值成员可以修改,但键成员不能修改(类型为const map<K,V>::key_type,只读)。

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

     <1>、map类型的操作

     **1、通过下标访问map对象

     注意:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。

     例:map<string, int> word_count;

            word_count["Anna"] = 1;

            将有以下操作:

            在word_count中查找键为Anna的元素,没有找到;

            将一个新的键-值对插入到word_count中,它的键是const string类型,保存为Anna, 而它的值初始化为0;

            读取新插入的元素,并将它的值赋为1;

     map下标操作返回的左值是特定键所关联的值。

    <2>、map::insert的使用

           注意insert的返回值;

           是一个pair类型,first成员是map迭代器,second成员是bool型,first成员指向map中已存在的值,second标识插入操作是否成功。

    <3>、查询操作

         m.count(k);//返回m中k键出现的次数。

         m.find(k);//查找m容器中是否存在k键,存在返回指向该元素的迭代器,不存在,返回超出末端的迭代器。

    <4>、从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类型。

 

5、set类型

     map是键-值对的集合,set容器是单纯的键的集合

     set支持大部分的map操作,但是set不支持下标操作符,set容器中存储的键必须为唯一的,而且不能修改。

6、multimap和multiset类型

     1**、注意multimap不支持下标操作(因为某个键可能对应多个值)

     2**、在multimap和multiset中,如果某个键对应多个实例,则这些实例在容器中将相邻存放。

     3**、在multimap和multiset中查找元素所使用的三种方法

      <1>、find和count

      <2>、lower_bound和upper_bound

              m.lower_bound(k):返回一个迭代器,指向键不小于k的第一个元素

              m.upper_bound(k);返回一个迭代器,指向键大于k的第一个元素

              m.equal_range(k);返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k),而second成员等价于

              m_upper_bound(k);

     在同一个键上调用lower_bound和upper_bound,将产生一个迭代器范围,指示出该键所关联的所有元素。

     如果查找的键不在multimap中,则这两个操作将返回同一个迭代器,指向依据元素的排列顺序该键应该插入的位置。

     例:

    

        typedef multimap<string, string>::iterator author_it;
	author_it beg = author.lower_bound("Barth,John");
	author_it end = author.upper_bound("Barth,John");

	while(beg != end)
	{
		cout<<beg->first <<"---"<<beg->second<<endl;
		beg++;
	}

     <3>、equal_range函数

    

        pair<author_it, author_it> pos = author.equal_range("Barth,John");
	while(pos.first != pos.second)
	{
		cout<<pos.first->first<<"---"<<pos.first->second<<endl;
		++pos.first;
	}



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值