C++ 关联容器

C++中对于容器的分类主要分为:顺序容器和关联容器。
顺序容器:主要是靠元素在容器中的存储位置保存和访问。
关联容器:元素主要是靠关键字来保存和访问。
关联容器和顺序容器的很多行为是一样的,不同之处反映了关键字的作用。
关联容器支持高效的关键字查找和操作。两个主要的关联容器为:map和set。

map:被定义为一对数值(pair()),其中key通常是字符串,作为索引;另一个数值是value。字典就是map的一种典型应用。如果想编写一个统计某个文字在一篇文章中出现的次数,则可以建立一份map,其中key设为待统计的字符串,value作为该字符出现的次数。

#include<iostream>
#include<map>
map<string, int>map_word

输入key/value值最简单的方法是:

map_word['theWord'] = 1

对于字数的统计我们可以使用如下代码:

string strInput
while(cin>>strInput)
    map_word[strInput]++

其中表达式map_word[strInput]会取出与strInput相对应的value值,如果strInput不在map中则会将该值添加到map中,并置为1.
由于关联容器并没有下标的概念,所以如果想对关联容器进行遍历,则使用其迭代器进行,如下:

map<string, int>::iterator it;
it = map_word:began()
for(;it!=map_word:end();it++)
    cout<<it->first<<it->second<<endl;

map对象有一个first对象对应key,一个second对象对应value。
当我们想查询某个key是否在map中时,我们最长用如下方法:
第1种方法:

if(!map['theKey'])
    //theKey并不存在与该map中。
使用这种方法有一个非常的大的缺点就是当map中没有这个key时,会将该键加入到map中,而其对应的value中会被设置为默认值0

第2种方法:使用map的find()函数,我们将要查找的key传入并调用

int nValue;
map<string, int>::iterator it;
if(it::end()!=map_word.find('theKey'))
    nValue = it->second;

第3中方法:

int nValue=0;
string theWord;
if(map_word.count(theWord))//相应的key存在
    nValue = map_word[theWord] 

set:是由一群key组成的,没有对应的value值。如果我们想知道某个值是否在集合中,就可以使用set。例如,我们在写一篇文章时,可能不想使用某些字符,此时我们就可以把不想使用的文字摘出来,使用set保存这些字符,在向map中添加字符时,先查找该字符是否在set中,元素类型为string。

#include<iostream>
#include<set>
#include<string>
string theWord;
set<string> set;
先检查该字符串是否存在于该setwhile(cin>>theWord)
    {
    if(set.count(theWord))
        continue;
    else
        map_word[theWord]++;
}

在以上代码中,如果输入的字符包含在set中,则执行continue跳出当前迭代,否则执行else语句,将该key值添加至map中,对于任何key值set只保留一份(当然map也一样),如果想保留多份请使用multiset和multimap。
map和set在进行添加元素时就已经对内部元素进行了排序,从大到小的顺序。

int test[10] = {1,3,3,8,4,1,9,7.2}
vector<int> vec(test, test+10)
set<int> iSet(vec.began(), vec.end())

此时iSet的元素将是

{1,2,3,7,8,9}

如果想为set添加元素可以使用insert函数

iSet,insert(vec.began(), vec.end())//添加某一范围的元素值
iSet.insert(19)//添加单一元素

在set上进行迭代和其他容器一样的使用方式:

set<int>::iterator it;
for(;it!=iSet.end();it++)
cout<<*it<<endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值