关联容器(map和set)

关联容器(map和set)
关联容器共有8个:map、set、multimap、multiset、unordered_map、unordered_set、unordered_multimap、unordered_multiset。
每个容器(1)是一个set或是一个map(2)不重复关键字(无multi)或有重复关键字(有multi)(3)按顺序保存元素(无unordered)或无序保存元素(有unordered)。
map和multimap定义在头文件map中,set和multiset定义在头文件set中,无序容器则定义在unordered_map和unordered_set中。
1、map
(1)map中的元素是一些关键字—值(key-value)对:关键字起到索引的作用,值则表示与索引相关联的数据。
(2)使用作用域运算符::来提取一个类型的成员,key_type是关键字类型,mapped_type是与关键字关联的值的类型,value是pair<const key_type,mapped_type>。
eg.map<string,int>::mapped_type var; //var是一个int
(3)map的使用
a、定义:map<string,size_t> word_count //string到size_t的空map
b、定义及初始化:map<string,string> authors = {{"Tom","Bob"},{"James","Kobe"},{"Dick","Jim"}};
c、访问元素:
string word;
++word_count[word]; //如果word还未在map中,下标运算符会创建一个元素,其关键字为word,值为0
d、提取元素:
for(const auto &w:word_count)
     cout<<w.first<<w.second<<endl; //从map中提取元素会得到一个pair类型的对象,它保存first和second两个(公有)数据成员,first保存关键字,second保存对应的值
e、迭代器的使用:
当解引用一个关联器迭代器时,我们会得到一个类型为容器的value_type的值得引用,对于map而言,value_type是一个pair类型,其first保存const的关键字,second保存值。
auto map_it = word_count.begin(); //定义一个指向pair<const key_type,mapped_type>类型的指针
cout<<map_it->first; //打印关键字,注意关键字是const的,不能修改
cout<<map_it->second; //打印值,可以通过迭代器改变元素的值
迭代器遍历容器:
auto map_it = word_count.cbegin(); //begin()是 Container<T>::iterator类型,cbegin()是 Container<T>::const_iterator类型
while(map_it != word_const.cend()){
     cout<<map_it->first<<map_it->second<<endl;
     ++map_it; //当使用一个迭代器遍历一个map、multimap、set或mutiset时,迭代器按照关键字升序遍历元素。
}
f、插入元素的四个方法:
word_counst.insert({word,1});
word_counst.insert(make_pair(word,1));
word_counst.insert(pair<string,size_t>(word,1));
word_counst.insert(map<string,size_t>::value_type(word,1));
g、删除元素的两种方法:
word_count.erase(word_count.begin(),word_count.end()); //通过传递给erase一个迭代器或者一个迭代器对来删除一个元素或一个元素范围
word_count.erase(removal_word); //给erase传递一个key_type参数,删除与此参数匹配的元素
h、下标操作的两种方法:
word_count["Anna"]; //如果"Anna"不在map中,则添加一个关键字为"Anna"的元素
word_count.at("Anna"); //如果"Anna"不在map中,则抛出一个out_of_range的异常
注意:对一个map进行下标操作时,会获得一个mapped_type对象,但当解引用一个map迭代器时,会得到一个value_type对象。
i、word_count.find(11); //返回一个迭代器,指向key==11的元素,如果不存在,则插入一个key==11的值
(4)unordered_map便利一遍,string类的key不会再按照字典类型排列。
     word_count.count(11); //返回key==11的元素的个数
2、set
(1)set中每个元素只包含一个关键字。当只想知道一个值是否存在时,set时最有用的。
(2)使用作用域运算符::来提取一个类型的成员,key_type是关键字类型,value与key_type相同。
(3)set的使用
a、定义及初始化:set<string> exclude = {"the","but","and","or","an"};
b、查找元素:exclude.find(word)==exclude.end() //find调用返回一个迭代器,如果给定关键字在set中,迭代器指向该关键字。否则返回尾后迭代器。
c、迭代器使用:set中的关键字是const的,所以set<int>::iterator set_it = iset.begin(); 则*set_it = 42;是错误的,因为set中的关键字是只读的。
d、添加元素:
set.insert(vec.cbegin(),vec.cend()); //接受一对迭代器
set.insert({1,3,5,7,9}); //接受一个初始化器列表
e、set不支持下标操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值