目录

  • 1. 关联式容器
  • 2. 键值对
  • 3. 树形结构的关联式容器
  • 4. set 和 map简单使用:
    • set简单使用
      • insert
      • erase
    • vs multiset
      • find
      • erase
    • map的简单使用
      • insert
      • operator[]
    • multimap
  • 5. set和map相关题
    • 1.map关于second的排序
      • 一vector
      • 二vector+迭代器
      • 三multimap+迭代器
      • 四优先级队列
      • 五优先级队列+迭代器
    • 2.前K个高频单词
  • 4. 底层结构
    • 4.1AVL树/高度平衡二叉搜索树
    • 4.2简单模拟实现链接:
    • 4.3红黑树
      • 概念:
      • 性质:
      • 底层简单模拟实现,以及实现中遇见的问题

1. 关联式容器

STL将自己的数据结构分为六大组件,
容器分为:
序列式容器:vector list …
类似于数据结构中的线性表,数据和数据之间没有关联,为了单纯的存储数据,

关联式容器:map和set…
底层是:平衡搜索树,数据和数据之间具有强烈的关系

2. 键值对

3. 树形结构的关联式容器

4. set 和 map简单使用:

set简单使用

insert

#include<set>
#include<iostream>
using namespace std;
void test_set1()
{set<int> s;s.insert(1);s.insert(5);s.insert(3);s.insert(4);s.insert(2);s.insert(2);set<int>::iterator it = s.begin();while (it != s.end()) {cout << *it << " ";++it;}cout << endl;auto it1 = s.begin();for (auto it1 : s){cout << it1 << " ";}cout << endl;
}
int main()
{test_set1();return 0;
}

1 2 3 4 5
1 2 3 4 5
所以走的是中序
因为没有重复,所以排序+去重

erase

#include<set>
#include<iostream>
using namespace std;
void test_set1()
{set<int> s;s.insert(1);s.insert(5);s.insert(3);s.insert(4);s.insert(2);s.insert(2);set<int>::iterator it = s.begin();while (it != s.end()) {cout << *it << " ";++it;}cout << endl;set<int>::iterator pos = s.find(2);//当没有找到这个值的时候,还要删除,就会报错if (pos != s.end()) {//pos必须是一个有效位置的迭代器s.erase(pos);}//直接使用值也是可以的//找到就删除,没有找到就直接返回s.erase(3);s.erase(30);auto it1 = s.begin();for (auto it1 : s){cout << it1 << " ";}cout << endl;
}
int main()
{test_set1();return 0;
}

vs multiset

set是排序+去重
multiset是排序
multi:多种

find

void test(){multiset<int> s;s.insert(2);s.insert(1);s.insert(5);s.insert(2);s.insert(3);s.insert(4);s.insert(2);s.insert(2);//找到的是那个2?//multiset<int>::iterator pos = s.find(2);auto pos = s.find(2);while (pos != s.end()){cout << *pos << " ";++pos;}cout << endl;
}
//2 2 2 2 3 4 5
//中序的第一个一,不一定是叶子
int main()
{test();return 0;
}

erase

void test() {multiset<int> s;s.insert(2);s.insert(1);s.insert(5);s.insert(2);s.insert(3);s.insert(4);s.insert(2);s.insert(2);auto pos = s.find(2);//方式一://while (pos != s.end() && *pos==2)//{//    auto newpos = pos;//   newpos++;//   s.erase(pos);// pos = newpos;//}//方式二:cout << s.erase(2) << endl;//4//1 3 4 5multiset<int>::iterator it1 = s.begin();for (auto it1 : s) {cout << it1 << " ";}cout << endl;
}
int main()
{test();return 0;
}

map的简单使用

insert

void test1()
{map<string, string> dict;pair<string, string> kv1("红色", "red");dict.insert(kv1);dict.insert(pair<string, string>("蓝色","blue"));//自动推导类型dict.insert(make_pair("黄色", "yellow"));//推荐dict.insert({"苹果","apple"});//C++11语法map<string, string>::iterator it = dict.begin();while (it != dict.end()){cout << (*it).first << " " << (*it).second << endl;cout << it->first << " " << it->second << endl;++it;}cout << endl;for (auto& kv : dict){cout << kv.first << " " << kv.second << endl;}
}int main()
{test1();return 0;
}

operator[]

void test()
{string arr[] = { "苹果","香蕉", "苹果", "梨", "苹果", "苹果" };map<string, int> countMap;//first//for (auto& str : arr)//{//   auto ret = countMap.find(str);//   if (ret == countMap.end())//没有找到//    {//     countMap.insert(make_pair(str, 1));//   }// else {//        ret->second++;//   }//}//second//for (auto& str : arr)//{//    auto kv = countMap.insert(make_pair(str, 1));//    if (kv.second==false) {//     kv.first->second++;//  }//}//thirdfor (auto& str : arr){countMap[str]++;}for (auto& kv : countMap){cout << kv.first << " " << kv.second << endl;}
}


operator[]功能:
1.插入
2.查找(key 对应的 value)
3.修改(key 对应的 value)

void test()
{map<string, string> dict;dict.insert(make_pair("right", "右边"));dict.insert(make_pair("left", "左边"));dict.insert(make_pair("left", "中间"));//插入,但是不成功dict["left"] = "做边";//修改,成功dict["test"];//插入,test对应的value=""dict["right"];cout << dict["mid"] << endl;//先插入,然后在输出""
}
int main()
{test();return 0;
}

multimap

void test()
{multimap<string, string> dict;dict.insert(make_pair("left", "左边"));dict.insert(make_pair("left", "左边"));dict.insert(make_pair("left", "中间"));dict.insert(make_pair("right", "右边"));for (auto& kv : dict) {cout << kv.first << " " << kv.second << endl;}
}
//left 左边
//left 左边
//left 中间
//right 右边
int main()
{test();return 0;
}

延伸:
multimap没有[]
查找也是第一个

5. set和map相关题

1.map关于second的排序

一vector

struct CountVal
{bool operator()(const pair<string, int>& left,const pair<string,int>& right){return left.second > right.second;}};
void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{map<string, int> countMap;for (auto& str : fruits){countMap[str]++;}//1.数据量不大,排序vector<pair<string, int>> sortV;for (auto& kv : countMap){sortV.push_back(kv);}sort(sortV.begin(), sortV.end(), CountVal());for (int i = 0; i < k; i++){cout << sortV[i].first << ":" << sortV[i].second << endl;}
}
int main()
{vector<string> arr = { "苹果","香蕉", "苹果", "梨", "杏", "苹果","苹果","香蕉", "桃", "梨", "苹果", "苹果" };GetFavoriteFruit(arr, 3);return 0;
}

二vector+迭代器

struct CountInterVal
{bool operator()(const map<string, int>::iterator& left, const map<string, int>::iterator& right) {return left->second > right->second;}
};
void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{map<string, int> countMap;for (auto& str : fruits)countMap[str]++;vector<map<string, int>::iterator> sortV;auto it = countMap.begin();while (it != countMap.end()){sortV.push_back(it);++it;}sort(sortV.begin(), sortV.end(), CountInterVal());for (int i = 0; i < k; i++)cout << sortV[i]->first << ":" << sortV[i]->second << endl;
}
int main()
{vector<string> arr = { "苹果","香蕉", "苹果", "梨", "杏", "苹果","苹果","香蕉", "桃", "梨", "苹果", "苹果" };GetFavoriteFruit(arr, 3);return 0;
}

三multimap+迭代器

struct CountInterVal
{bool operator()(const map<string, int>::iterator& left, const map<string, int>::iterator& right) {return left->second > right->second;}
};
void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{map<string, int> countMap;for (auto& str : fruits)countMap[str]++;multimap<int,string,greater<int>> sortMap;for (auto& kv : countMap) {sortMap.insert(make_pair(kv.second,kv.first));}
}
int main()
{vector<string> arr = { "苹果","香蕉", "苹果", "梨", "杏", "苹果","苹果","香蕉", "桃", "梨", "苹果", "苹果" };GetFavoriteFruit(arr, 3);return 0;
}

四优先级队列

struct CountVal
{bool operator()(const pair<string, int>& left, const pair<string, int>& right){return left.second < right.second;}
};
void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{map<string, int> countMap;for (auto& str : fruits)countMap[str]++;priority_queue<pair<string, int>, vector<pair<string, int>>, CountVal> pq;for (auto& kv : countMap) {pq.push(kv);}while (k--) {cout << pq.top().first << pq.top().second << endl;pq.pop();}
}
int main()
{vector<string> arr = { "苹果","香蕉", "苹果", "梨", "杏", "苹果","苹果","香蕉", "桃", "梨", "苹果", "苹果" };GetFavoriteFruit(arr, 3);return 0;
}

五优先级队列+迭代器

struct CountIterVal
{bool operator()(const map<string, int>::iterator& left, const map<string, int>::iterator& right) {return left->second < right->second;}
};
void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{map<string, int> countMap;for (auto& str : fruits)countMap[str]++;priority_queue<map<string, int>::iterator, vector<map<string, int>::iterator>, CountIterVal> pq;auto it = countMap.begin();while (it != countMap.end()){pq.push(it);++it;}while (k--){cout << pq.top()->first << ":" << pq.top()->second << endl;pq.pop();}cout << endl;
}
int main()
{vector<string> arr = { "苹果","香蕉", "苹果", "梨", "杏", "苹果","苹果","香蕉", "桃", "梨", "苹果", "苹果" };GetFavoriteFruit(arr, 3);return 0;
}

2.前K个高频单词

链接: 前K个高频单词

class Solution {public:vector<string> topKFrequent(vector<string>& words, int k) {map<string,int> CountMap;for(auto& str:words) CountMap[str]++;multimap<int,string,greater<int>> sortMap;for(auto& kv:CountMap)sortMap.insert(make_pair(kv.second,kv.first));vector<string> v;auto it = sortMap.begin();while(k--){v.push_back(it->second);++it;}return v;}
};

4. 底层结构

4.1AVL树/高度平衡二叉搜索树

概念:
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下
当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。

一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:
它的左右子树都是AVL树
左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)

如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在O( log2n) ,搜索时间复杂度O( log2n)。

4.2简单模拟实现链接:

链接: C++中“AVL”树的模拟实现以及实现中遇见的问题

4.3红黑树

概念:

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的

性质:

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则它的两个孩子结点是黑色的(说明:树中没有连续的红色节点)
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点(说明:每条路径黑色节点的数量相等)
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)

思考:为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍?

最短路径:全黑
最长路径:一黑一红

假设每条路径黑节点的数量是:N
N <= 任意路径长度 <= 2N

底层简单模拟实现,以及实现中遇见的问题

https://blog.csdn.net/sakeww/article/details/125036961

C++中“map和set”相关内容整理分析相关推荐

  1. .NET中使用Memcached的相关资源整理 转载之DUDU 程序员打杂的站长

    .NET中使用Memcached的相关资源整理 Memcached官方站点:http://www.danga.com/memcached/ Memcached Win32 1.2.6下载:http:/ ...

  2. python对文件的操作都有什么_python中文件操作的相关内容总结(附示例)

    本篇文章给大家带来的内容是关于python中文件操作的相关内容总结(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 文件操作介绍 说到操作文件我们肯定会想到流,文件的操 ...

  3. 开发中最全网络相关内容

    iOS中网络相关内容 声明:部分图片来源于网络,有些内容也来自各个平台老师讲解的视频,部分内容来自<计算机网络>这本书中,除去参考其他博客链接外,其他部分不作出参考链接来源展示,如有相关原 ...

  4. JPA、EJB、事物管理、WebSphere ---相关内容整理

    目录 1.前言 ■实现原理:容器管理事务 ■代码实现简单描述: 2.EJB 标签 2.1.EJB中的有状态与无状态( @stateless/@stateful ) 2.1.@Stateless 与 @ ...

  5. Ogre中SDL转为OIS相关内容

    Xcode Ogre1.10中加入OIS库实现SDL和OIS切换 一.         关于OIS库以及头文件的引用 关于OIS库及头文件我自己引用的Ogre1.9中的库及文件, 首先将文件导入Ogr ...

  6. 病理图像相关内容整理

    乳腺癌论文: [1] Spanhol, F., Oliveira, L. S., Petitjean, C., Heutte, L., A Dataset for Breast Cancer Hist ...

  7. NET中使用Memcached的相关资源整理

    本文转自:http://www.cnblogs.com/dudu/archive/2009/07/19/1526407.html Memcached官方站点:http://www.danga.com/ ...

  8. .NET中使用Memcached的相关资源整理

    Memcached官方站点:http://www.danga.com/memcached/ Memcached Win32 1.2.6下载:http://code.jellycan.com/memca ...

  9. 个人课中所学vlan相关知识整理

    VLAN定义: VLAN(Virtual Local Area Network)的中文名为"虚拟局域网". 虚拟局域网(VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理 ...

最新文章

  1. android 屏幕旋转180度
  2. 一套代码小程序WebNative运行的探索01
  3. 2.4 嵌入矩阵-深度学习第五课《序列模型》-Stanford吴恩达教授
  4. OpenCV关于hog特征向量的个数
  5. boost::log模块实现宽字符日志记录示例
  6. 趣味编程:C#中Specification模式的实现
  7. python:就喜欢看你看不惯我又干不掉我的样子
  8. winform 中show()函数和showdialog()函数区别
  9. .NET Framework 4 中的新增功能【转载】
  10. 更新cuda驱动10.0==>11.2
  11. python牛顿法寻找极值_牛顿法求极值及其Python实现
  12. Canon打印机重复打印某一页的一半的故障
  13. Mysql8.0安装步骤
  14. 获取基金数据python库_PYTHON爬取基金数据及基金筛选
  15. ct与x光的哪个辐射大_X光和CT,哪个辐射大?这些数字,医生可能并没告诉你
  16. 初创游戏企划草案经验谈
  17. error setting certificate verify locations: CAfile: F:/gitt/Git/mingw64/ssl/certs/ca-bundle.crt
  18. 什么是RPA? Robotic Process Automation
  19. python二分法查找程序_基础算法——查找(二分法)(python)
  20. MMSystem.h头文件

热门文章

  1. 大学计算机李凤霞课本百度云,北京理工大学李凤霞老师个人资料
  2. python基础教程网易云_Python爬虫教程:网易云音乐歌词
  3. 立创EDA的元件库导入AD
  4. IP地址划分、组播地址、公有IP、私有IP
  5. python易盾滑动验证码
  6. 排列组合问题 “n个球放入m个盒子(8种)”
  7. vue路由传参 params传参不能传对象
  8. 5款常用的html5游戏引擎以及优缺点分析
  9. PDF怎么压缩到最小?有在线压缩的方法吗
  10. 网易2017春招[编程题]赶去公司@Java