点我返回目录
3、map
在高中里我们都学过函数的映射,大概都慢慢还给老师了。
map大概讲的就是映射关系。它所在的库为#include<map>,利用他能快速Hash我们的数据。(啊我是这么理解的啦)。
在之前我们使用数组,比如a[12]=1;
这其实就是一种映射关系,先不管地址不地址的问题,我们是不是可以理解为在12的位置对应的是1。
a[15]=2;在15的位置对应的就是2。
a[202]=3;在202的位置对应的就是3。
那么map可以先理解为这种映射关系的加强版本,(至于具体是怎么进行映射的,大家自学一下?)大概用的多了理解就深刻了吧?直接讲怎么用。我们可以直接结合之前介绍过的string来实践。
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
int main()
{
map<string,int>mp;
string name;
name="ZhangSan";
mp[name]=1;
name="LiSi";
mp[name]=2;
name="WangWu";
mp[name]=3;
return 0;
}
看上面的代码,map<string,int>mp; 表示我们声明了一个将string类型映射为int类型的map模板,并且命名为mp;
那么我们下面的操作就是和上面数组举出的例子差不多啦。比如将张三的位置设置为1,将李四的位置设为2,将王五的位置设为3。这里如果你稍稍百度一下就会发现很多资料中给出了类似于以前学过的函数的映射来说明问题。但是可惜我不会口胡这一段,所以遗憾跳过。(其实是懒,大概只需要知道怎么用就好)。
而查询操作其实也是和数组一样的,比如我们输入了一个string,那么我们就直接把这个string当成下标去访问mp[s]就好,还是直接看代码吧:
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
int main()
{
map<string,int>mp;
string name;
name="ZhangSan";
mp[name]=1;
name="LiSi";
mp[name]=2;
name="WangWu";
mp[name]=3;
cin>>name;
cout<<mp[name]<<endl;
return 0;
}
我们知道对应关系一定是唯一的,也就是说在这里一个串只能对应一个值,和映射一样,只接受多对一不接受一对多。
推荐自学.clear() .size() .empty() .find() 等等实用的函数(实在是懒得拉,网上资料讲的很详细)。
提到这里就要讲到一个没有玩过的传心坂本了,如何来遍历map来获取所有我们储存的元素呢。
要引入一个迭代器iterator的东西,这是一个为了STL模板库而专门设计的访问器?可能我描述的不够准确。
直接看如何操作就好了。用的多了就会了。还是用上面的例子。
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
int main()
{
map<string,int>mp;
string name;
name="ZhangSan";
mp[name]=1;
name="LiSi";
mp[name]=2;
name="WangWu";
mp[name]=3;
cin>>name;
cout<<mp[name]<<endl;
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
map<string,int>::iterator it; 这句话表示命名了一个map<string,int>类型的迭代器类型,名字为it
然后我们在for循环里让it先等于mp的begin很好理解就是开头。然后在它不到mp的end之前一直操作,感觉是不是又和数组很像了呢。但是由于这是一个迭代器类型,所以我们在输出的时候用first来取当前位置的前一个键值,second取后一个键值,粗暴的说就是你在开map<string,int >的时候的这两个类型啦。这里强烈建议自己动手,输出一下才看的明白。
迭代器在map和后续要讲的set里面都是比较重要的内容,他们的大多数调用都建立在迭代器上,一定要动手试试。(或者查查资料试试)。
4、set
set从字面意思上就很好理解啦,集合。集合的性质是什么呢?不知道!建议自学。
set存在于库文件#include<set>中,它可以很好的帮助我们排序、去重吧?
直接来看如何建立一个set
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main()
{
set<int>set1;
set<char>set2;
set<double>set3;
set<string>set4;
return 0;
}
简单粗暴,实际上和之前介绍过的vector差不多吧。
再来看如何往一个set中添加元素,调用.insert()
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main()
{
set<string>s;
string name;
name="ZhangSan";
s.insert(name);
name="LiSi";
s.insert(name);
name="WangWu";
s.insert(name);
name="WangWu";
s.insert(name);
return 0;
}
很好理解吧,在上面的例子中,因为集合元素的唯一性,所以理论上插入了两个王五,应该只会被记录为一个。
这时我们调用.size() 可以查看set中元素的个数
cout<<s.size()<<endl;
那果然是三个啦。
和上面讲到的一样,set的遍历也是需要迭代器的参与,甚至代码都几乎一样,但是因为这里没有两个键所以遍历应该这样来
#include<iostream>
#include<string>
#include<set>
using namespace std;
int main()
{
set<string>s;
string name;
name="ZhangSan";
s.insert(name);
name="LiSi";
s.insert(name);
name="WangWu";
s.insert(name);
name="WangWu";
s.insert(name);
for(set<string>::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<endl;
}
return 0;
}
可以观察到,我们输出了这三个名字后,他们是按照字典序排序好的,这是因为set的性质,会按照键值的价值从小到大自动排序好。这一点应该是经常被用到的。建议自学删除操作。