#include<cstdio>
#include<vector>
#include<functional>
#include<algorithm>
#include<set>
#include<unordered_set>
#include<map>
#include<unordered_map>
using namespace std;
char s[6][10] = { "Able","was","I","I","saw","elbA" };
int a[7] = { -2,3,1,4,4,7 };
int main()
{
  set<int,greater<int> > GREATER_SET;//自动排序去重按从大到小排,必须加上functional头文件
  set<int> SET;//自动排序从小到大
  multiset<int> MULTI_SET;//自动排序不去重不加比较类(greater<int>)默认是从小到大排序
  unordered_set<int> UNORDERED_SET;//不自动排序但去重
  unordered_multiset<int> UNORDERED_MULTISET;//无序不去重集合
  //map的相关系列进行类比即可
  map<string,int> MAP;
  multimap<string, int> MULTI_MAP;
  unordered_map<string, int> UNORDERED_MAP;//通过哈希确定位置,不一定与原始序列相同,主要就是快
  unordered_multimap<string, int> UNORDERED_MULTIMAP;
  //*******************************************************************
  //*******************************************************************
  //先看set系列的输出
  printf("original:\n");
  for (int i = 0; i < 7; i++)
  {
    printf("%d ", a[i]);
    GREATER_SET.insert(a[i]);
    SET.insert(a[i]);
    MULTI_SET.insert(a[i]);
    UNORDERED_SET.insert(a[i]);
    UNORDERED_MULTISET.insert(a[i]);
  }
  printf("\n");
  printf("GREATER_SET:\n");
  for (set<int, greater<int> >::iterator it = GREATER_SET.begin();
    it != GREATER_SET.end(); it++)
  {
    printf("%d ", *it);
  }
  printf("\n");
  printf("SET:\n");
  for (set<int>::iterator it = SET.begin();
    it != SET.end(); it++)
  {
    printf("%d ", *it);
  }
  printf("\n");
  printf("MULTI_SET:\n");
  for (multiset<int>::iterator it = MULTI_SET.begin();
    it != MULTI_SET.end(); it++)
  {
    printf("%d ", *it);
  }
  printf("\n");
  printf("UNORDERED_SET:\n");
  for (unordered_set<int>::iterator it = UNORDERED_SET.begin();
    it != UNORDERED_SET.end(); it++)
  {
    printf("%d ", *it);
  }
  printf("\n");
  printf("UNORDERED_MULTISET:\n");
  for (unordered_multiset<int>::iterator it = UNORDERED_MULTISET.begin();
    it != UNORDERED_MULTISET.end(); it++)
  {
    printf("%d ", *it);
  }
  printf("\n");
  //再看map系列的输出
  pair<string, int> psi;
  printf("original:\n");
  for (int i = 0; i < 6; i++)
  {
    printf("%s->%d ", s[i], i);
    MAP[s[i]] = i;
    psi.first = s[i];//char数组自动封装成string
    psi.second = i;
    MULTI_MAP.insert(psi);
    UNORDERED_MAP[s[i]] = i;
    UNORDERED_MULTIMAP.insert(psi);
  }
  printf("\n");
  printf("MAP:\n");
  for (map<string, int>::iterator it = MAP.begin(); 
    it != MAP.end();it++)
  {
    printf("%s->%d ", it->first.c_str(), it->second);
  }
  printf("\n");
  printf("MULTI_MAP:\n");
  for (multimap<string, int>::iterator it = MULTI_MAP.begin();
    it != MULTI_MAP.end(); it++)
  {
    printf("%s->%d ", it->first.c_str(), it->second);
  }
  printf("\n");
  printf("UNORDERED_MAP:\n");
  for (unordered_map<string, int>::iterator it = UNORDERED_MAP.begin();
    it != UNORDERED_MAP.end(); it++)
  {
    printf("%s->%d ", it->first.c_str(), it->second);
  }
  printf("\n");
  printf("UNORDERED_MULTIMAP:\n");
  for (unordered_multimap<string, int>::iterator it = UNORDERED_MULTIMAP.begin();
    it != UNORDERED_MULTIMAP.end(); it++)
  {
    printf("%s->%d ", it->first.c_str(), it->second);
  }
  printf("\n");
  return 0;
}
