C++STL标准库学习笔记multiset
Posted AwakeFantasy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++STL标准库学习笔记multiset相关的知识,希望对你有一定的参考价值。
C++STL标准库学习笔记(三)multiset
STL中的平衡二叉树数据结构
前言:
在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来。
介绍:
有时需要在大量增加,删除数据的同时,还需要大量数据的查找
我们希望增加数据,删除数据,查找数据都能在log(n)复杂度完成
排序+二分查找显然不行,因为加入新数据就要重新排序。
在这个时候!我们就可以使用“平衡二叉树”数据结构存放数据,体现在STL中就是以下四种“排序容器”:
multiset set multimap map
英语课:set:集合
反正我们只管用就行了,具体实现应该可以参考《STL源码剖析》
从这里开始就需要有一定程度的数据结构和C++面向对象的知识了,如果忘记的话可以去复习一下,当然,这里我们只要会用就行了,不需要特别深的理解。
1.1 multiset用法
multiset<T> st;
定义了一个叫multiset变量st,st里面可以存放T类型的数据(自定义元素也行),并且能够自动排序。开始st为空。
排序规则:表达式“a < b”为true,则a排在b前面
可用st.insert添加元素,st.find查找元素,st.erase删除元素,复杂度都是log(n)(还有好多函数,这个就要自己去研究了,以后有机会也会来补充的)
1.2 multiset上的迭代器
multiset<T>::iterator p;
p是迭代器,(大致)相当于指针,可用于指向multiset中的元素。访问multiset中的元素要通过迭代器。
与指针的不同:
multiset上的迭代器可++,--,用!=和==比较,不可比大小,不可加减整数,不可相减。(指针就能这样操作,可以用来算长度啥的)
multiset<T> st;
st.begin() 返回值类型为 multiset<T>::iterator,是指向st中的头一个元素的迭代器。
st.end() 返回值类型为 multiset<T>::iterator,是指向st中的最后一个元素后面的迭代器。(有没有一种既视感,就是[ st.begin(), st.end() )和前面sort的范围很像,不过估计是因为迭代器不能比较大小,为了方便判断全部遍历过了就让st.end()指向了最后一个的后面,访问到st.end()时刚好退出)
对迭代器 ++ ,其就指向容器中下一个元素,-- 令其指向上一个元素。
样例:
#include<iostream> #include<cstring> #include<set>//使用multiset和set需要 using namespace std; int main(int argc, char const *argv[]) { multiset<int>st; int a[10] = {1,14,12,13,7,13,21,19,8,8}; for (int i = 0; i < 10; i++) { st.insert(a[i]);//插♂入的是a[i]的复制品 } multiset<int>::iterator i;//迭代器,近似于指针 for ( i = st.begin(); i != st.end(); i++) { cout<<*i<<",";//输出:1,7,8,8,12,13,13,14,19,21, } cout<<endl; i = st.find(22);//查找22,返回值是迭代器 if (i == st.end())//查找不到则返回值为end() { cout<<"Not Found"<<endl;//输出:Not Found } st.insert(22);//插入22 i = st.find(22); if (i == st.end()) { cout<<"Not Found"<<endl; } else { cout<<"Found:"<<*i<<endl;//输出:Found:22 }//找到则返回指向找到的元素的迭代器 i = st.lower_bound(13); //返回最靠后的迭代器it,使得[begin,it)中的元素 //都在13前面,复杂度log(n) cout<<*i<<endl;//结果:13 i = st.upper_bound(8); //返回最靠前的迭代器it,使得[it,end())中的元素 //都在8后面,复杂度log(n) cout<<*i<<endl;//结果:12 st.erase(i);//删除迭代器i指向的元素,即12 for ( i = st.begin(); i != st.end(); i++) { cout<<*i<<",";//输出:1,7,8,8,13,13,14,19,21,22, } return 0; }
程序中部分重要的地方单独拎出来强调:
i = st.find(22);
作用是查找22,返回值是迭代器
i = st.lower_bound(13);
返回最靠后的迭代器it,使得[begin,it)中的元素
都在13前面,复杂度log(n)
i = st.upper_bound(8);
返回最靠前的迭代器it,使得[it,end())中的元素
都在8后面,复杂度log(n)
st.erase(i);
删除迭代器i指向的元素
1.3后记:
从这里开始就有数据结构那味了,如果平衡二叉树忘记的话,记得去看看(虽然我觉得逻辑理解了,会用就行)。另外,可以看见这里的用法和前面sort,binary_search之类也有相似之处,估计学完一部分STL标准库内容,其他内容看到函数名就会用了。感谢大家读到这里,祝大家健康快乐吉祥如意恭喜发财学业有成早生贵子年年有余,以及头发茂密,下篇博客再见拜拜。
以上是关于C++STL标准库学习笔记multiset的主要内容,如果未能解决你的问题,请参考以下文章
C++STL标准库学习笔记vector deque list
STL标准库 & 范型编程学习笔记:C++学习网站STL六大部件介绍
STL标准库 & 范型编程学习笔记:C++学习网站STL六大部件介绍