Map
map<key, value>
key起到索引的作用。
//常见使用:字数统计程序
#include <map>
#include <string>
map<string, int> words; //string是key, int是value
string tword;
while(cin >> tword)
{
words[tword]++; //字数统计
//其中words[tword]取出与tword相应的value
//如果tword不在map里,则它会因此被放入map中,并获得默认值0
}
map<string,int>::iterator it=words.begin();
for (; it!=word.end(); ++it)
cout<<"key:"<<it->first //first对应key
<<"value:"<<it->second<<endl; //second对应value
//cout输出字眼在map里出现的次数
查询map内是否存在某个key的三种方法
方法一:key索引
int count = 0;
if(!(count = words["vermeer"]))
缺点:如果key不存在于map内,这个key会被自动加入map中,对应的value被设置为所属类型的默认值。
方法二:利用map自带的find()函数
int count = 0;
map<string,int>::iterator it;
it = words.find("vermeer");
if (it != words.end())
count = it->second;
如果key已放在其中,find()会返回一个iterator,指向key/value形成pair(pair class是标准库的一员),反之则返回words.end()。
方法三:利用map自带的count()函数
int count = 0;
if(words.count("vermeer")) //只要存在
value = words["vermeer"];
count()会返回某特定项在map内的个数。
任何一个key在map内最多只会有一份,如需储存多份相同的key,就必须使用multimap。(略)
Set
Set由一群key组合而成;
如果想知道某值是否存在于某个集合内,可以用set。
//常见应用:统计排除的字集
#include<set>
#include<map>
#include<string>
map<string,int>words;
stirng tword;
set<string>word_exclusion;//set只有key值
while(cin >> tword)
{
if(word_exclusion.count(tword));
//如果tword在“排除字集”内,则此次迭代被跳过
continue;
words[ tword ]++;//到达此处说明tword不属于需要排除的字集,纳入map
}
set:升序排列
默认情况下,set里的元素默认升序排列(从小到大排列)
int ia[10]={1,3,5,8,5,3,1,5,8,1};
vector<int>vec(ia,ia+10);
set<int>iset(vec.begin(),vec.end());
//iset的元素为{1,3,5,8}
//(已经排除了和1,3,5,8相同的元素)
set:加入元素
- 为set加入单一元素,可使用单一参数的insert():
iset.insert(ival);//ival为单一元素
- 为set加入多个元素,可使用双参数的insert():
iset.insert(vec.begin(),vec.end());
set:迭代
使用泛型指针iterator
set<int>::iterator it=iset.begin();
for(; it!=iset.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
泛型算法中还有其他和set相关的泛型算法:
set_intersection(),
set_union(),
set_difference(),
set_symmetric_difference()
对于任何key值,set只能储存一份,要储存多份相同key值,必须使用multiset。(略)