实例讲解,set,multiset,map,multimap关联容器

测试环境:windows 7 vs2010

内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。

除了各容器都有的函数外,还支持以下成员函数:

find: 查找等于某个值的元素(x小于y和y小于x同时不成立即为相等)

lower_bound: 查找某个下界

upper_bound: 查找某个上界

equal_range: 同时查找上界和下界

count:计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等)

insert: 用以插入一个元素或一个区间

在学习关联容器之前,我们先要学习pair模板,pair模板是struct形式,因此其内部成员默认都是公有的。

template<class _T1, class _T2> //两个类型参数
struct pair
{
    typedef _T1 first_type;//_T1定义成first_type,_T2定义成second_type
    typedef _T2 second_type;
    _T1 first; //first 是_T1 类型
    _T2 second; //seconde 是_T2类型
    pair(): first(), second() { } //无参构造函数
    pair(const _T1& __a, const _T2& __b)
    : first(__a), second(__b) { }// 分别用__a初始化first,__b去初始化second
    template<class _U1, class _U2> //这是一个模板函数构造函数,其通过一个pair对象去初始pair对象的first和second对象
    pair(const pair<_U1, _U2>& __p)
    : first(__p.first), second(__p.second) { }
};

值得强调的是map/multimap容器中存放的都是pair对象,且按照first成员变量从小到大排序的。

第三个构造函数实例

pair<int,int>

p(pair<double,double>(5.5,4.6));

// p.first = 5, p.second = 4

下面看下set和multiset(set和multiset区别在set不允许有重复的key值)

template<class Key, class Pred= less<Key>,
class A = allocator<Key> >
class multiset{ …… };

Pred类型的变量决定了multiset中的元素,“一个比另一个小”是怎么定义的。multiset运行过程中,比较两个元素x,y的大小的做法,就是生成一个Pred类型的变量,假定为op,若表达式op(x,y) 返回值为true,则x比y小。

Pred的缺省类型是less<Key>。

template<class T>
structless : public binary_function<T, T, bool>
{
    bool operator()(const T& x, const T& y) const
    {
        return x <y;
    }
};

//less模板是靠< 来比较大小的 ,因此当key为类时候,则该类必须重载运算符

#include<iostream>
#include<set>
using namespace std;
void main()
{
    set<int>::iterator setIter;
    pair<set<int>::iterator,set<int>::iterator> mypair;
    pair<set<int>::iterator,bool> result;
    set<int> myset;
    for(int i=0;i<10;i++)
    {
        myset.insert(i);
    }
    result=myset.insert(3);//set insert返回pair对象 而multiset返回迭代器
    if(!result.second)
    {
        cout<<"3 已经存在"<<endl;
    }
    setIter=myset.find(2);//find函数返回迭代器
    if(setIter!=myset.end())
    {
      cout<<*setIter<<endl;
    }
    else
    {
        cout<<"not find"<<endl;
    }

    mypair=myset.equal_range(4);//同时求得lower_bound和upper_bound
    cout<<"lower_bound:"<<*mypair.first<<endl;
    cout<<"upper_bound:"<<*mypair.second<<endl;

    for(setIter=myset.begin();setIter!=myset.end();)
    {
        if(*setIter%2==0) //删除偶数
        {
          setIter=myset.erase(setIter);
        }
        else
        {
            setIter++;
        }
    }
    cout<<"删除偶数后"<<endl;
    for(setIter=myset.begin();setIter!=myset.end();setIter++)
    {
        cout<<*setIter<<endl;
    }
    cin.get();
}

map/multimap里放着的都是pair模版类的对象,且按first从小到大排序,其中map中key不允许重复。

multimap
template<classKey, class T, class Pred= less<Key>,
class A = allocator<T> >
class multimap{
….
typedefpair<const Key, T> value_type;
…….
}; //Key 代表关键字的类型

multimap中的元素由<关键字,值>组成,每个元素是一个pair对象,关键字就是first成员变量,其类型是Key

multimap中允许多个元素的关键字相同。元素按照first成员变量从小到大排列,缺省情况下用less<Key>定义关键字的“小于”关系。

#include<iostream>
#include<map>
using namespace std;
void main()
{
	map<int,string> stu_name;// 编号 姓名 其中是按照编号排序 其是键值对
	map<int,string>::iterator mapIter;
	stu_name.insert(map<int,string>::value_type(1,"zhang san"));
	stu_name.insert(map<int,string>::value_type(2,"li si"));
	stu_name.insert(make_pair(3,"wang er")); //使用make_pair也行

	mapIter=stu_name.find(2);//
	if(mapIter!=stu_name.end())
	{
		cout<<mapIter->second.c_str()<<endl;
	}
	else
	{
		cout<<"not find"<<endl;
	}

	for(mapIter=stu_name.begin();mapIter!=stu_name.end();mapIter++)
	{
		cout<<mapIter->first<<":"<<mapIter->second.c_str()<<endl;
	}

	cin.get();
}

版权声明:欢迎转载,如有不足之处,恳请斧正。

时间: 2024-10-12 19:28:50

实例讲解,set,multiset,map,multimap关联容器的相关文章

stuff about set multiset map multimap

A lot of interviewers like to ask the candidates the difference between set and multiset(map and multimap).What does multi actually mean?Multi-container could have duplicate element.Check the code below. 1 /*******************************************

关联容器set, multiset

set, multiset, map, multimap 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 除了各容器都有的函数外,还支持以下成员函数. find:查找等于某个值的元素(x<y和y<x同时不成立即为相等) lower_bound:查找某个下界 upper_bound:查找某个上界 equal_range:同时查找上界和下界 count:计算等于某个值的元素个数(x<y和y<x同时不成立即为相等) insert:用以插入一个元素或一个区间 multiset

C++拾遗(七)——关联容器

关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和set.map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效地支持关于某个键是否存在的查询.set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素.如果一个键必须对应多个实例,则需使用 multimap 或 multiset,这两种类型允许多个元

C++primer第十章 关联容器

关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 一般来说,如果希望有效地存储不同值的集合,那么使用 set 容器比较合适,而 map 容器则更适用于需要存储(乃至修改)每个键所关联的值的情况.在做某种文本处理时,可使用 set 保存要忽略的单词.而字典则是 map 的一种很好的应用:单词本身是键,而它的解释说明则是值. set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素.如果一

初探STL之关联容器

关联容器 分类:set, multiset, map, multimap 特点:内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 常用函数: find: 查找等于某个值 的元素(x小于y和y小于x同时不成立即为相等) lower_bound : 查找某个下界 upper_bound : 查找某个上界 equal_range : 同时查找上界和下界 count :计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等) insert: 用以插入一个元素或一个区间 set 特点:

c++ primer 10 关联容器

关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,顺序容器则通过元素在容器中的位置顺序存储和访问元素 关联容器类型 map 关联数组:元素通过键来存储和读取 set 大小可变的集合,支持通过键实现的快速读取 multimap 支持同一个键多次出现的 map 类型 multiset 支持同一个键多次出现的 set 类型 pair类型 pair是一种模版类型,在创建pair对象,必须提供两个类型名. 头文件 utility pairs 类型提供的操作 pair<T1, T2>

stl中顺序性容器,关联容器两者粗略解释

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

《C++primer》v5 第11章 关联容器 读书笔记 习题答案

11.1 map是关联容器,vector是顺序容器 11.2 略 11.3 int main() { map<string,int> word; string s; while(cin>>s) word[s]++; for(auto i:word) cout<<i.first<<" "<<i.second<<endl; return 0; } 11.4 void convers(string &s) { s

STL对比解说——关联容器

STL对比解说——关联容器 1. 概述 关联容器会根据某种准则自动排序容器中元素.operator<为默认的排序准则,也可以提供自己的排序准则. 关联容器典型的实现是二叉树(red-black tree),每个元素都有a parent 和 two children.左子树为小值,右子树为大值. 关联容器的优势是查找更快的(对数复杂度,顺序容器线性复杂度). 关联容器的key是常量不能直接更改,因为这样会破坏元素的自动排序.因此所有algorithm中变动性算法都不能用. 关联容器包含set, m