c++类库stl

把c++视频全部又看了一遍,总结了stl类库

总结如下:

vector:
vector向量中,可以用[x][y]表示第x-1位里的第y-1个元素;
s[i] //  直接以下标方式访问容器中的元素
s.front() //  返回首元素
s.back() //  返回尾元素
s.push_back(x) //  向表尾插入元素x
s.size() //  返回表长
s.empty() //  表为空时,返回真,否则返回假
s.pop_back() //  删除表尾元素
s.begin() //  返回指向首元素的随机存取迭代器
s.end() //  返回指向尾元素的下一个位置的随机存取迭代器
s.insert(it, val) //  向迭代器it指向的元素前插入新元素val
s.insert(it, n, val)//  向迭代器it指向的元素前插入n个新元素val
s.insert(it, first, last) //  将由迭代器first和last所指定的序列[first, last)插入到迭代器it指向的元素前面
s.erase(it) //  删除由迭代器it所指向的元素 s.erase(first, last)//  删除由迭代器first和last所指定的序列[first, last) s.reserve(n) //  预分配缓冲空间,使存储空间至少可容纳n个元素
s.resize(n) //  改变序列长度,超出的元素将会全部被删除,如果序列需要扩展(原空间小于n),元素默认值将填满扩展出的空间 s.resize(n, val) //  改变序列长度,超出的元素将会全部被删除,如果序列需要扩展(原空间小于n),val将填满扩展出的空间 s.clear() //  删除容器中的所有元素
s.swap(v) //  将s与另一个vector对象进行交换



deque//双向动态数组
deque  可以在数组的开头和末尾插入和删除数据
a.push_back(x) 数组后面加数据
a.push_front(y)数组前面加数据
a.pop_back()数组后面依次删除数据
a.pop_front()数组前面依次删除
deque迭代器
deque<int>::itreator x
size_t n=distance(a.begin(),x(迭代器名))//algorithm算法distance()


list双向链表   链表没有下标,只能用迭代器,不能用数组循环输入或输出链表中的数据//插入删除数据时比vector速度快
可以在list开头插入元素
可以在list末尾插入元素
可以在list中间插入元素
删除list中的元素
元素进行反转和排序
a.push_front(x) 在链表前面加入数据//从前往后排序,先插入的在后面
a.front()//链表前面第一个的元素
a.back()//链表最后一个的元素
a.push_back(x) 链表后面加数据//输入数据速度很快//vector速度慢,因为扩大数组时是先建立一个新数组,然后再复制到新数组里
a.push_front(y)链表前面加数据
a.pop_back()链表后面依次删除数据
a.pop_front()链表前面依次删除
a.insert(a.begin(),10)//在开头的前面插入10;a.begin为迭代器
a.insert(a.end(),4,20)//在后端插入4个20//a.end()为迭代器
a.insert(a.begin(),b.begin(),b.end())//将b全部插入A的前面,换成b.end()则插入a后面,
a.insert(a.begin(),++b.begin(),b.end())
a.erase(迭代器)//删除迭代器
a.erase(x,y)//从X删除y,包括x,不包括y
list 反转和排序
a.reverse();//链表反转
a.sort();//链表排序,从小到大


stl  stack  堆栈后进先出,后进先出  无迭代器,只能在末端操作数据
自适应容器(容器适配器)
栈适配器//定义堆栈
    stack< int,deque<int> > a;
    stack< int,vector<int> > b;
    stack< int,list<int> > c;
    stack<int> d;
a.empty();//检查堆栈是否为空
a.size();//检查堆栈的大小
a.pop();//弹出数据
a.top();//查看栈顶数据,不删除
a.push(x);//把x压入堆栈


stl  queue 队列  先进先出,要求两端都能操作,所以不能建立vector队列 ;
插入只能在队尾,弹出只能是队首   无迭代器,所以只能在两端操作数据,不能在中间插入或者删除元素
栈适配器
q.empty();//检查队列是否为空
q.size();//检查队列的大小
q.front();//查看队首的数据,并不删除
q.back();//查看队尾数据,并不删除
q.push(x);从对首到队尾依次添加元素
q.pop();//只能在队首依次删除;


stl 优先级队列  priority_queue  不能使用list
分为 :最大值优先级队列,最小优先级队列
a.push(x);//插入元素,按降序或升序
a.top();//查看优先级队列首元素
a.pop();//删除优先级队列首元素
a.empty();//判断是否为空
a.size();//求优先级队列大小
priority_queue<int> a;//最大值优先级队列
priority_queue<int,greater<int>() > a;//最小值优先级队列


bitset

在 STL
的头文件中 <bitset> 中定义了模版类 bitset,用来方便地管理一系列的 bit 位的类。bitset 除了可以访问指定下标的 bit

位以外,还可以把它们作为一个整数来进行某些统计。

bitset
模板类需要一个模版参数,用来明确指定含有多少位。
bt.any()  //  bt 中是否存在置为 1 的二进制位?
bt.none()  //  bt 中不存在置为 1 的二进制位吗?
bt.count()  //  bt 中置为 1 的二进制位的个数
bt.size()  //  bt 中二进制位的个数
bt[pos]  //  访问 bt 中在 pos 处的二进制位
bt.test(pos)  //  bt 中在 pos 处的二进制位是否为 1
bt.set()  //  把 bt 中所有二进制位都置为 1
bt.set(pos)  //  把 bt 中在 pos 处的二进制位置为 1
bt.reset()  //  把 bt 中所有二进制位都置为 0
bt.reset(pos)  //  把 bt 中在pos处的二进制位置为0
bt.flip()  //  把 bt 中所有二进制位逐位取反
bt.flip(pos)  //  把 bt 中在 pos 处的二进制位取反
bt[pos].flip()  //  同上
bt.to_ulong()  //  用 bt 中同样的二进制位返回一个 unsigned long 值
os << bt  //  把 bt 中的位集输出到 os 流

迭代器  
常用的迭代器操作:*iter  ++iter  --iter iter1==iter2  iter1!=iter2
vector deque
iter+n  iter-n >  >=  
迭代器范围
begin/end //end()是指向最后一个的下一个地址   first/last

顺序容器:  vector   list   deque
    vector<int>::size_type a1;//数组循环时,定义i的类型.用于数组中数据较多时
    vector<int>::iterator  a2;
    vector<int>::const_iterator    a3;
    vector<int>::reverse_iterator  a4;//逆序迭代器,rbegin(),rend();
    vector<int>::const_reverse_iterator a5;
    vector<int>::difference_type      a6;
        vector<int>::value_type          a7;
    vector<int>::reference    a8;
    vector<int>::const_reference    a9;

a.size() 返回类型是  size_type   
a.max_size()//返回这个容器能容纳的最大数量  返回类型 size_type
a.resize(x)或a.resize(x,y)表示新增x个y//调整容器大小


删除元素:
a.erase(x)//第x个元素                                    
a.erase(x,y)//删除x-y,包括x,不包括y
a.clear()//全部删除
a.swap(b)//a向量数组与b向量数组交换
a.assign(c.begin(),c.end())//将c的begin()到c的end()赋值a,begin不一定是数组开始的位置
a.reserve(x)//增大数组容量至x
a.capacity()//测量数组的容量

向量数组排序快
向量数组二分查找   binary_search(a.begin(),a.end(),x)//在数组中找x


只适合string类型的操作
s.substr(x,y):从字符串中的第x到y的所有元素
s.substr(x);x以后的所有元素
s.substr():s中的所有字符串
s.append("x"):在最后添加字符串x=s.insert(s.end(),"x")
replace(x,y,"z"):从x到y换成z

set:
set(集)//不能放入重复的数据//与multiset//数据可以重复//插入后会排好序
插入:a.insert(x);
支持find()和erase();
if(a.find(x)==a.end())//判断x是否在a中
set清除数据可以用a.clear();
set<int> a;
set<double> ss;
a.insert(x);//将x插入数组a中,插入结束后,a中数组已经排好序    
s.begin() //  返回指向第一个元素的迭代器
s.clear() //  清除所有元素
s.count() //  返回某个值元素的个数
s.empty() //  如果集合为空,返回true(真)
s.end() //  返回指向最后一个元素之后的迭代器,不是最后一个元素
s.equal_range() //  返回集合中与给定值相等的上下限的两个迭代器
s.erase() //  删除集合中的元素
s.find() //  返回一个指向被查找到元素的迭代器
s.get_allocator() //  返回集合的分配器
s.insert() //  在集合中插入元素
s.lower_bound() //  返回指向大于(或等于)某值的第一个元素的迭代器
s.key_comp() //  返回一个用于元素间值比较的函数
s.max_size() //  返回集合能容纳的元素的最大限值
s.rbegin() //  返回指向集合中最后一个元素的反向迭代器
s.rend() //  返回指向集合中第一个元素的反向迭代器
s.size() //  集合中元素的数目
s.swap() //  交换两个集合变量
s.upper_bound() //  返回大于某个值元素的迭代器
s.value_comp() //  返回一个用于比较元素间的值的函数

映射:map//插入数据后也是自动按字典顺序排列 二叉树,红黑树
map就是从键(key,不可以重复)到值(value)的映射。因为重载了[ ]运算符,map像是数组的“高 级版”。例如可以用一个map<string,int>month_name来表示“月份名字到月份编号”的映射, 然后用month_name["July"]=7这样的方式来赋值。
map插入方法:1: a.insert(map<int,string>::value_type(x,"y"));
2:a.insert(make_pair(x,"y"));
3:a.insert(pair<int,string>(x,"y"));
4:a[x]="y";
输出 键 a->first 键值 a->second.c_str;  
查找:cout<<a[x]//直接输出x对应的值
multimap键值可以重复
插入方法:
1: a.insert(multimap<int,string>::value_type(x,"y"));
2:a.insert(make_pair(x,"y"));
3:a.insert(pair<int,string>(x,"y"));
multimap的查找
multimap<int,string>::iterator fi;
fi=a.find(x)//查找x
cout<<fi->first<<fi->second.c_str()<<endl;
a.count(x)统计multimap中x的个数
删除:
1:ma.erase(x);//x为键
2:ma.erase(ma.lower_bound(x),ma.upper_bound(x));//删除一个范围

stl算法
头文件
#include<algorithm>
#include<numeric>//数值算法
#include<functional>//函数适配器
预定义的函数对象
negate<type>()
plus<type>()
minus<type>()
greater<type>//从大到小
less<type>//从小到大
for_each(v.begin(),v.end(),函数预定义);//对两个迭代器内的数据进行
预定义的函数适配器
  int visit(int v)    //  遍历算子函数
{
    cout << v << " ";
    return 1;
}
  for_each(L.begin(), L.end(), visit);


min_element/max_element找出容器中的最小/最大值//
    vector<int>::iterator min_it = min_element(L.begin(), L.end());
    vector<int>::iterator max_it = max_element(L.begin(), L.end());

copy在容器间复制元素
     copy(vOne.begin(), vOne.begin() + 3, vTwo.begin() + 4);


元素计数算法
count(a.begin(),a.end(),x)
最大值和最小值
min_element(b,e)//迭代器b到迭代器e之间//返回值是一个迭代器 输出时:cout<<*min_element
max_element(b,e)//同上
查找算法:
find()    //返回是所在位置的地址的迭代器
find_if() //
search_n(b,e,c,v)//找连续的数

猜你喜欢

转载自blog.csdn.net/HWT_ZZU/article/details/83864832