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;
先检查该字符串是否存在于该set中
while(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;