STL常用容器归纳总结(3)

这篇主要讲一下关联容器
1.set(集合容器)/ multiset(多重集容器)

实现头文件:< set>

概述:

set和multiset都是集合类模板,其元素值称为关键字。set中元素的关键字是唯一的,multiset中元素的关键字可以不唯一,而且默认情况下会对元素按关键字自动进行升序排列。
查找速度比较快,同时支持集合的交、差和并等一些集合上的运算,如果需要集合中的元素允许重复那么可以使用multiset。

主要成员函数:

  • empty():判断容器是否为空
  • size():返回容器中实际元素个数
  • insert():插入元素
  • erase():从容器删除一个或几个元素
  • clear():删除所有元素
  • count(k):返回容器中关键字k出现的次数
  • find(k):如果容器中存在关键字为k的元素,返回该元素的迭代器,否则返回end()值
  • upper_bound():返回一个迭代器,指向关键字大于k的第一个元素
  • lower_bound():返回一个迭代器,指向关键字不小于k的第一个元素
  • 迭代器函数:begin()、end()、rbegin()、rend()

演示代码:

#include<iostream>
#include<cstdio>
#include <set>
using namespace std;
int main()
{
    set<int> s;            //定义set容器s
    set<int>::iterator it;    //定义set容器迭代器it
    s.insert(1);
    s.insert(3);
    s.insert(2);
    s.insert(4);
    s.insert(2);
    printf(" s: ");
    for (it = s.begin(); it != s.end(); it++)
        printf("%d ", *it);
    printf("\n");
    multiset<int> ms;    //定义multiset容器ms
    multiset<int>::iterator mit; //定义multiset容器迭代器mit
    ms.insert(1);
    ms.insert(3);
    ms.insert(2);
    ms.insert(4);
    ms.insert(2);
    printf("ms: ");
    for (mit = ms.begin(); mit != ms.end(); mit++)
        printf("%d ", *mit);
    printf("\n");
    return 0;
}

输出:
s: 1 2 3 4
ms: 1 2 2 3 4

2.map(映射容器)/ multimap(多重映射容器)

实现头文件:< set>

概述:

map和multimap都是映射类模板。映射是实现关键字与值关系的存储结构,可以使用一个关键字key来访问相应的数据值value。
在map和multimap 中的key和value是一个pair类结构。
pair类结构的声明形如:

1
2
3
4
struct pair
{ T first;
T second;
}

map/multimap利用pair的<运算符将所有元素即key-value对按key的升序排列,以红黑树的形式存储,可以根据key快速地找到与之对应的value(查找时间为O(log2n))。
map中不允许关键字重复出现,支持[]运算符;而multimap中允许关键字重复出现,但不支持[]运算符。

主要成员函数:

  • empty():判断容器是否为空
  • size():返回容器中实际元素个数
  • map[key]:返回关键字为key的元素的引用,如果不存在这样的关键字,则以key作为关键字插入一个元素(不适合multimap)
  • insert(elem):插入一个元素elem并返回该元素的位置
  • clear():删除所有元素
  • find():在容器中查找元素
  • count():容器中指定关键字的元素个数(map中只有1或者0)
  • 迭代器函数:begin()、end()、rbegin()、rend()

演示代码:

1.

1
2
map<char,int> mymap; //定义map容器mymap,其元素类型为pair<char,int>
mymap['a'] = 1; //或者mymap.insert(pair<char,int>('a',1) );

2.

#include<iostream>
#include <map>
using namespace std;
int main()
{
    map<char, int> mymap;                     //定义map容器mymap
    mymap.insert(pair<char, int>('a', 1));   //插入方式1    
    mymap.insert(map<char, int>::value_type('b', 2));   //插入方式2    
    mymap['c'] = 3;        //插入方式3
    map<char, int>::iterator it;
    for (it = mymap.begin(); it != mymap.end(); it++)
        printf("[%c,%d] ", it->first, it->second);
    printf("\n");
    return 0;
}

输出:
[a,1] [b,2] [c,3]

0%