C++ STL学习笔记
这篇笔记是对慕课上郭炜老师的c++课程自己的总结,方便日后复习
平衡二叉树作用:需要在大量增删数据的同时大量查找数据并都能在log(n)复杂度完成。
四种**“排序容器”**:multiset,set,multimap,map。
注:使用multiset和set要用头文件#include<set>
使用multimap和map要用头文件#include<map>
1.multiset用法
- 默认用法
multiset <T> st;//默认从小到大
multiset <T,greater<T>>st;//从大到小
➢定义了一个multiset<T类型>的变量st,st里面可以存放T类型的数据,并且能自动排序。开始st为空。
➢排序规则: 表达式“a < b”为true, 则a排在b前面。
➢可用st.insert添加元素,st.find查找元素,st.erase删除元素,复杂度都是log(n)。
#include <iostream>
#include <cstring>
#include <set>
using namespace std;
int main()
{
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]的内容复制放入容器st中
multiset<int>::iterator i;//迭代器,近似于指针,用于访问容器st
for(i=st.begin();i!=st.end();++i) //st.begin()和st.end()为st指向头元素和尾元素后面一个位置的迭代器,类型为multiset<T>::iterator
cout<<*i<<",";
cout<<endl; //输出排好序的数组a[i]:1,7,8,8,12,13,13,14,19,21
}
- multiset上的迭代器
multiset <T>::iterator P;
此处p是迭代器,相当于指针,只能通过迭代器访问multiset的元素。
与指针的相同与不同:
相同点:可++,–,用!= 和==比较
不同点:不可比大小,不可加减整数,不可相减
继续使用上例迭代器i 其中元素为{1,7,8,8,12,13,13,14,19,21}
{
i=st.lower_bound(13);//返回最靠后的迭代器it使左闭右开的区间[begin(),it)中的元素都在13前面,复杂度为log(n)
cout<< *i <<endl;//输出13,迭代器指向第一个13
i=st.upper_bound(8)//返回最靠前的迭代器it使左闭右开的区间[it,end())中的元素都在8后面,复杂度为log(n)
cout<< *i <<endl;//输出12,迭代器指向第二个8后面的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;
}
- 自定义规则用法
#include <iostream>
#include <cstring>
#include <set>
using namespace std ;
struct Rule1 {
bool operator()(const int & a,const int & b)const
{
return (a