C++关联容器

C++关联容器浅谈:map set multiset multimap ;

在学习C++关联容器之前,简单的介绍一下与之相关的一种标准库类型——pair类型(utility头文件中)

pair的主要操作:pair<T1,T2> p1(v1,v2) 创建一个pair对象,分别为T1,T2类型,first数据成员初始化为v1 second数据成员初始化为v2;make_pair(v1 , v2)以v1,v2值创建一个新的pair对象;
pair创建和初始化:pair<string,string> name("zhangsan","lisi");若需要定义相同且较多的pair类型对象,可使用typedef简化声明 typedef pair<string,string> Name; Name zuozhe("zhangsan","lisi"); Name student("wangwu","zhouliu");...
Map容器:键值对的集合,通常理解为关联数组;使用map对象 先包含map头文件;map的构造函数 map<k,v> m(b,e) 创建map类型的对象,存储迭代器b,e范围内的元素。元素的类型必须能转换为pair<const k,v>
对于map容器的下标应用:如果下标所表示的键在容器不存在,则添加元素:example:
map<string,int>word_count;
string word;
while(cin>>word){
    ++word_count[word];
}
上例创建一个map对象 用来记录单词出现的次数。
定义了map对象之后,需要想容器里面添加元素:可以使用insert成员来实现,也可通过下标的形式来定义 如下:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
    map<int,string> name;
    name.insert(make_pair(1,"zhangsan"));
    name.insert(make_pair(2,"lisi"));
    name.insert(make_pair(2,"lisi"));//重复插入将被忽略
    name[4] = "zhangsan";
    map<int,string>::iterator it;
    for(it = name.begin();it!=name.end();++it){
        cout<<it->first<<":"<<it->second;
        cout<<endl;
            }
            return 0;
}
对于map容器使用三个函数:
cout<<name.count(1)<<endl;  //返回键值1出现的次数
cout<<name.find(1)->second; //是否存在按照键1存在的元素,存在返回该元素的迭代器
cout<<name.erase(1);	//删除键值为1的元素
multimap类型:在map容器中可以使用一个键对应多个实例;并且返回的结果是自动排序的,与向容器里添加元素的顺序无关;与map容器包含一样的头文件map;
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
    typedef multimap<string,string> Friend;
    Friend f;
    Friend::iterator ib,ie;
    f.insert(make_pair("aa","bb"));
    f.insert(make_pair("aa","cc"));
    f.insert(make_pair("dd","cc"));
    f.insert(make_pair("aa","dd"));
    f.insert(make_pair("dd","cc"));
    ib = f.begin();
    ie = f.end();
    while(ib!=ie){
        cout<<ib->first<<":"<<ib->second<<endl;
        ++ib;
    }
    cout<<"aa好友"<<f.count("aa")<<endl;
    ib = f.lower_bound("aa");
    ie = f.upper_bound("aa");
    while(ib!=ie){
        cout<<ib->first<<":"<<ib->second<<endl;
        ++ib;
    }
    return 0;
}
上例中lower_bound 绑定的是当前键值的迭代器的起始位置,而upper_bound则是当前键值的迭代器的末位置的下一个元素;


与map相比较,set只是单纯键的集合,当只想知道一个值是否存在的时候,使用set容器最为理想,使用set集合需要包含set头文件;与map类似,set中的键也是唯一,且不可修改;同时set也使用insert,find,cound,erase函数操作:

#include <iostream>
#include <set>
#include <vector>
using namespace std;

int main()
{
    vector<int> ivec;
    for(vector<int>::size_type i=0;i!=10;i++){
        ivec.push_back(i);
        ivec.push_back(i);
    }
    set<int> isec(ivec.begin(),ivec.end()); //初始化isec容器
    isec.insert(10);    //向set容器中添加数据
    isec.insert(11);
    isec.insert(12);
    cout<<ivec.size()<<endl;    // 值为20
    cout<<isec.size()<<endl;    // 值为13 不包含相同的键
    cout<<isec.count(1)<<endl;  //计算容器中键1 的个数,同时也可以查询是否存在1
    cout<<(isec.find(13)!=isec.end());  //查看1键 是否存在set容器中
    isec.erase(isec.find(1));
    return 0;
}
同multimap类似,multiset容器可以存在相同的键,使用之时也需要包含同文件set




















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值