序列式容器:其底层的数据结构是线性结,例如:vector、list、deque、forward_list
关联式容器:里面存储的是
例如:map、set、multimap、multiset
什么是键值对? (大致理解:就是一个类,里面两个元素)
template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b)
: first(a),
second(b)
{}
};
set的元素是val,但是实际上底层是
不需要构造键值对。另外,set默认是升序(按小于比较),不可以重复。
multiset和set差不多,唯一的区别就是val可以重复。

map 里面存放的元素是键值对,key不能重复,默认是升序。 multimap和map的关系类似于set和multiseta


operotor[]的重载
先看这样代码的输出

我们可以清楚的看到,当map的下标是key的时候,返回值是val的引用 实际上,底层原理也正是这样。

我们可以借助这样的特点完成一些统计。
例如:有很多的水果,统计水果出现的次数。

map<string, string> dict;
dict.insert(make_pair("sort", "排序")); //这个是插入,分成功和失败
dict["left"] = "左边"; // 插入+修改(先插入<"left","">,然后在修改val)
dict["insert"]; // 插入 (直接插入<"insert", "">)
dict["insert"] = "插入"; // 修改
dict["left"] = "左边、剩余"; // 修改
牛客网-------- KY264 单词识别
https://www.nowcoder.com/practice/16f59b169d904f8898d70d81d4a140a0?tpId=94&tqId=31064&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fbit-kaoyan%2Fquestion-ranking&tPage=2

#include
#include
#include
using namespace std;
int main()
{
string str;
getline(cin,str);
map<string,int> m1;
multimap<int,string,greater<int>> m2;//要排升序,次数会重复
int i = 0, j = 0;
//先全部转换为小写
for(auto& e : str)
{
if(isupper(e))
e = tolower(e);
}
//拿出每一个单词放入m1(排的字母顺序)
for(i = 0; i < str.size(); i++)
{
if(str[i] == ' ' || str[i] == '.')
{
string s = str.substr(j,i-j);
j = i + 1;
m1[s]++;
}
}
//排的次数
for(const auto& e : m1)
{
m2.insert(make_pair(e.second,e.first));
}
//打印
for(const auto& e : m2)
{
cout << e.second <<":" << e.first <<endl;
}
return 0;
}