济宁网站建设 果壳科技,自然志wordpress下载,山西省,网站建设公司十大文章目录 一、set系列1.set①insert②find③erase④lower_bound与upper_bound 2.multiset①count②equal_range 二、map系列1.map①insert1.插入pair的四种方式2.常用两种方式 ②[]2.multimap①count②equal_range 一、set系列
1.set
①insert
函数分析#xff08;C98… 文章目录 一、set系列1.set①insert②find③erase④lower_bound与upper_bound 2.multiset①count②equal_range 二、map系列1.map①insert1.插入pair的四种方式2.常用两种方式 ②[]2.multimap①count②equal_range 一、set系列
1.set
①insert
函数分析C98 简单使用 setint s;s.insert(5);s.insert(6);s.insert(7);s.insert(9);s.insert(8);s.insert(1);s.insert(2);s.insert(3);s.insert(4);s.insert(4);s.insert(4);s.insert(4);for (auto e : s){cout e ;}运行结果 可见set具有天然的去重和排序功能—— 二叉搜索树的结构
②find
函数分析 简单应用 setint s;s.insert(5);s.insert(6);s.insert(7);s.insert(9);s.insert(8);s.insert(1);s.insert(2);s.insert(3);s.insert(4);setint::iterator it s.find(8);if (it ! s.end()){cout 找到了 endl;}else{cout 没找到 endl;}
③erase 函数分析 简单应用 setstring s;s.insert(张三);s.insert(李四);s.insert(王五);size_t n s.erase(王五);cout n endl;setstring::iterator it s.find(李四);if (it ! s.end()){it s.erase(it);if(it ! s.end())cout *it endl;}运行结果 ④lower_bound与upper_bound
函数分析 简单使用
std::setint myset;
std::setint::iterator itlow, itup;for (int i 1; i 10; i)// 10 20 30 40 50 60 70 80 90 myset.insert(i * 10); for (auto e : myset)
{cout e ;
}
cout endl;itlow myset.lower_bound(30);
itup myset.upper_bound(60);
//为了删除[30,60]且符合迭代器区间的左闭右开的规则,因此最终调整为[30,70)auto it myset.erase(itlow, itup);if(it ! myset.end())cout *it endl;for (auto e : myset)
{cout e ;
}运行结果
2.multiset
基本与set一致这里介绍几个适合它使用的。强调一点mutiset可以存相同数据
①count 函数分析 简单使用 multisetint s;s.insert(1);s.insert(1);s.insert(2);s.insert(3);s.insert(4);for (auto e : s){cout e ;}cout endl;cout s.count(1) endl;运行结果
②equal_range
函数分析
简单运用 multisetint s;s.insert(1);s.insert(1);s.insert(1);s.insert(1);s.insert(2);s.insert(3);s.insert(4);//pairmultisetint::iterator, multisetint::iterator it s.equal_range(1);auto it s.equal_range(1);//区间为[1,2)auto begin it.first;auto end it.second;while (begin ! end){cout *begin ;begin;}cout endl;运行结果
强调
在插入相同值时并不能保证稳定性即相同数据的前后顺序会不会发生改变——涉及AVL树。set系列的迭代器在底层都是const迭代器表明其值是不能被修改的在底层上来讲如果修改了就破坏了二叉搜索树的结构。
二、map系列
1.map
①insert
1.插入pair的四种方式 mapstring, string dict;//第一种方式命名对象插入pairstring, string p(insert, 插入);dict.insert(p);//第二种方式直接用匿名对象进行插入dict.insert(pairstring, string(sort, 排序));//第三种方式make_pair交由函数底层会被优化成内联—— C98。//推荐使用这种因为大多数都支持。//C98只支持单参数的构造函数dict.insert(make_pair(object, 对象));//第四种方式{} ——C11采用了这种方式从而支持了多参数的构造函数。dict.insert({ English,英语 });补充make_pair函数——C98
2.常用两种方式 //字典序mapstring, string dict;dict.insert(make_pair(object, 对象));dict.insert(make_pair(insert, 插入));dict.insert(make_pair(sort, 排序));dict.insert(make_pair(English, 英语));for (const auto e : dict){cout e.first : e.second endl;}//查找次数string strs[] { 苹果, 西瓜, 苹果, 樱桃, 苹果, 樱桃\, 苹果, 樱桃, 苹果 };mapstring, int countMap;for (const auto e : strs){auto it countMap.find(e);if (it ! countMap.end()){(it-second);}else{countMap.insert(make_pair(e, 1));}}for (const auto e : countMap){cout e.first : e.second endl;}②[]
函数原理分析 简单使用 string strs[] { 苹果, 西瓜, 苹果, 樱桃, 苹果, 樱桃, \苹果, 樱桃, 苹果 };mapstring, int countMap;for (const auto e : strs){countMap[e];}for (const auto e : countMap){cout e.first : e.second endl;}时间复杂度因为底层是二叉搜索树的结构因此为logN底层是优化了的包括最坏情况也优化成了大概logN。 补充map对已有元素是不会再进行插入和覆盖的至少在VS下是这样。
2.multimap
说明因为支持了重复元素的插入因此不存在[]运算符重载。
①count 基本用法同multiset 简单应用 multimapstring, string dict;dict.insert(make_pair(tell, 告诉));dict.insert(make_pair(tell, 分辨));dict.insert(make_pair(hot, 热的));dict.insert(make_pair(hot, 性感的));for (const auto e : dict){cout e.first : e.second endl;}size_t n dict.count(tell);//这里模拟的是一词多义即tell有几种意思。cout tell有: n 种意思 endl;②equal_range 用法同multiset 简单运用 multimapstring, string dict;dict.insert(make_pair(tell, 告诉));dict.insert(make_pair(tell, 分辨));dict.insert(make_pair(hot, 热的));dict.insert(make_pair(hot, 性感的));//pairmultimapstring, string::const_iterator, \multimapstring, string::iterator \it dict.equal_range(tell);//tell的几个意思分别是auto it dict.equal_range(tell);auto begin it.first;auto end it.second;while (begin ! end){cout begin-first : begin-second endl;begin;}