STL容器的常用用法
STL:
1.vector:
vector<int> v;
vector<int> v(10);//定义大小为10的int型向量容器。
vector<int> v(10,3);//定义大小为10,每个元素为3。
v.push_back(2);//尾部添加元素2.
v.pop_back();//尾部删除一个元素.
v[0]=2;
v[1]=3;//下标访问。
vector<int>::iterator it;//迭代器访问
for(it=v.begin();it!=v.end();it++)
{
cout<<*it<<" ";
}
//元素插入,插入位置必须是迭代器位置
v.insert(v.begin(),8);//最前面插入
v.insert(v.begin()+2,8);
v.insert(v.end(),8);//末尾追加
//元素删除
v.erase(v.begin()+2);//删除第2+1个元素
v.erase(v.begin()+1,v.begin()+5);//删除迭代器第一到第五区间的所有元素
v.clear();//删除所有元素
reverse(v.begin(),v.end());//反向排列向量所有元素(可以反向排列某段迭代器区间元素)
sort(v.begin(),v.end());//sort排序(默认升序排列)
//设计排序比较函数
bool comp(const int& a,const int& b)
{
return a>b;//降序排列
}
sort(v.begin(),v.end(),comp);
v.size();//返回向量大小,即元素个数
v.empty();//判空,空时返回1,不空时返回0。
2.stack:
//堆栈容器
stack<int> s;
s.push(1);//入栈
s.pop();//出栈
s.top();//返回栈顶元素
s.size();//返回元素个数
s.empty();//判空
3.queue:
//队列容器
//只能从队尾插入元素,队首删除元素
queue<int> q;
q.push(1);//入队
q.pop();//出队
q.front();//返回队首元素
q.back();//返回队尾元素
q.size();//返回元素个数
q.empty();//判空
4.priority_queue:
//优先队列容器
//只能从队尾插入元素,队首删除元素
//队列中最大的元素总是位于队首(默认从大到小排序,自己可以自定义比较函数来修改)
priority_queue<int> pq;
pq.push(1);//入队
pq.pop();//出队
pq.top();//返回队首元素
pq.size();//返回元素个数
pq.empty();//判空
//自定义比较函数
元素为结构体:
struct info
{
string name;
float score;
bool operator < (const info &a) const
{
return score>a.score;//从小到大(注意这次的符号)
}
};
元素非结构体:
struct mycomp
{
bool operator () (const int &a,const int &b) const
{
return a>b;//从小到大(注意这次的符号)
}
};
priority_queue<int,vector<int>,mycomp> pq;//显示说明其内部结构是vector.(注意:当有自定义比较函数时,必须显示说明其内部结构是vector!)
5.deque:
创建
deque<int> d;
deque<int> d(10);//容量为10
deque<int> d(10,8.5);//10个并初始化为8.5
插入:
push_back()尾部插入,扩张队列
push_front()头部插入,不扩张队列,往后挤,把尾部的元素挤出去了
以上两个参数是一个元素对象
insert()中间某位置插入元素,不扩张队列,仍是挤出尾部的元素
参数为两个:迭代器位置+元素对象
eg:d.insert(d.begin()+1,88);//即插入到第二个位置,后面的往后顺延,最后一个丢失
遍历:
d[i]//数组方式
deque<int>::iterator it;
for(it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}//前向迭代器方式
deque<int>::reverse_iterator it;
for(rit=d.rbegin();rit!=d.rend();rit++)
{
cout<<*rit<<" ";
}//反向迭代器方式
删除:
首部:d.pop_front();
尾部:d.pop_back();
中间:d.erase(d.begin()+1);
清空:d.clear();
6.set:
#include <set>
#include <algorithm>
//不会重复插入相同键值的元素
//采用红黑树的平衡二叉检索树结构,中序遍历
set<int> s;
s.insert(3);//默认从小到大
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
cout<<*it<<" ";
}
//反向遍历
set<int>::reverse_iterator rit;//反向迭代器
for(rit=s.rbegin();rit!=s.rend();rit++)
{
cout<<*rit<<" ";
}
//元素删除,删除对象可以是某个迭代器位置上的元素、等于某键值的元素、一个区间上的元素
s.erase(s.begin()+1);
s.erase(6);
s.erase(s.begin(),s.begin()+4);
s.clear();
s.size();
s.find(6);//查找键值6,查到了则返回其迭代器位置,否则返回最后一个元素后面的位置,即end()
set<int>::iterator it;
it=s.find(6);
if(it!=s.end())
cout<<*it<<endl;
//自定义比较函数 默认从小到大存储
//非结构体元素
struct comp
{
bool operator () (const int& a,const int& b) const
{
return a>b;//从大到小
}
}
set<int,comp> s;//创建
set<int,comp>::iterator it;
其他操作一样
//结构体元素
struct info
{
string name;
float score;
bool operator < (const info &a) const
{
return score>a.score;//从大到小
}
}
set<info> s;//创建
set<info>::iterator it;
7.multiset:
#include <set>
#include <algorithm>
//允许重复的元素键值插入
//在插入,删除,查找方面与<set>有区别
multiset<string> ms;
ms.insert("abc");
multiset<string>::iterator it;
//erase()可以删除某个迭代器位置的元素,某段区间的元素,键值等于某个值的所有重复元素(并返回删除元素个数)。
ms.erase("123");
ms.clear();
//find(),如果查到,返回该元素第一次出现的迭代器位置,否则返回end()
it=ms.find("123");
8.map:
#include <map>
#include <algorithm>
//不会重复插入相同键值的元素
//采用红黑树的平衡二叉检索树结构,中序遍历
//比较函数只对键值进行比较
//和set使用大都相同
map<string,float> m;
m["jack"]=98.5;//插入元素
m.insert(pair<string,float>("lvhuan",18.5));
map<string,float>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
cout<<(*it).first<<":"<<(*it).second<<endl;//输出键值与映照数据
}
//可以删除某个迭代器位置元素、等于某键值的元素、某迭代器区间的所有元素
m.erase(4);
m.clear();
//反向遍历
map<string,float>::reverse_iterator it;
for(it=m.rbegin();it!=m.rend();it++)
{
cout<<(*it).first<<":"<<(*it).second<<endl;//反向输出键值与映照数据
}
//find()返回键值所处迭代器位置或end()位置
//自定义比较函数(默认从小到大)
非结构体元素
struct comp
{
bool operator () (const int &a,const int &b) const
{
return a>b;//从大到小
}
}
map<int,char,comp> m;
map<int,char,comp>::iterator it;
结构体元素
struct info
{
string name;
float score;
bool operator < (const info &a) const
{
return score>a.score;//从大到小
}
}
map<info,int> m;//创建
map<info,int>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
cout<<(*it).second<<":";
cout<<((*it).first).name<<" "<<((*it).first).score<<endl;
}
9.multimap:
#include <map>
#include <algorithm>
//允许重复插入相同键值的元素
multimap<string,float> m;
m["jack"]=98.5;//插入元素
m.insert(pair<string,float>("lvhuan",18.5));
multimap<string,float>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
cout<<(*it).first<<":"<<(*it).second<<endl;//输出键值与映照数据
}
//erase()可以删除某个迭代器位置的元素,某段区间的元素,键值等于某个值的所有重复元素(并返回删除元素个数),还有清空clear()
//find(),如果查到,返回该元素第一次出现的迭代器位置,否则返回end()
it=m.find("123");
10.list:
//双向循环链表容器
//迭代器只能使用“++”或“--”,不能使用“+n”或“-n”。
创建:
list<int> l;
list<int> l(10);//容量10
插入,都会自动扩张:
尾部:push_back()
首部:push_front()
中间:只能插到迭代器位置处:l.insert(it,20);//元素对象为20
遍历:
list<int>::iterator it;
for(it=l.begin();it!=l.end();it++)
{
cout<<*it<<" ";
}//前向迭代器方式
list<int>::reverse_iterator it;
for(rit=l.rbegin();rit!=l.rend();rit++)
{
cout<<*rit<<" ";
}//反向迭代器方式
删除:remove()删除一个元素值,值相同的元素都会被删除。
l.remove(1);//删除值为1的所有元素
l.pop_front();//删除首部元素
l.pop_back();//删除链表尾部元素
list<int>::iterator it;
for(it=l.begin();it!=l.end();it++)
{
cout<<*it<<" ";
}
it=l.begin();
it++;
it++;
l.erase(it);//删除迭代器位置元素
l.clear();//清空
查找:find(),找到则返回迭代器位置,否则返回end().
eg:it=find(l.begin(),l.end(),5);//查找这个区间上的值为5的元素的位置
升序排序:
l.sort();
删除连续重复元素,只保留一个:
l.unique();//注意是删除连续重复,不是单单重复
11.bitset:
//bit位元素的序列容器,每个元素只占一个bit位,取值0或1.
/*
bitset类
方法列表:
b.any() b中是否存在置为1的二进制位?
b.none() b中不存在置为1的二进制位吗?
b.count() b中置为1的二进制位的个数
b.size() b中二进制位的个数
b[pos] 访问b中在pos处的二进制位
b.test(pos) b中在pos处的二进制位是否为1?
b.set() 把b中所有二进制位都置为1
b.set(pos) 把b中在pos处的二进制位置为1
b.reset() 把b中所有二进制位都置为0
b.reset(pos) 把pos处的二进制位置为0
b.flip() 把b中所有二进制位取反
b.flip(pos) 把pos处的二进制位取反
b.to_ulong() 用b中同样的二进制位返回一个unsigned long值
os<<b 把b中的位集输出到os流
*/
//创建
bitset<100000> b;//创建时必须指定容器大小,且不能再修改大小。默认初始值为0.
//元素赋值
b[6]=1;//下标法,最低位为第0位
b.set();//全部置1
b.set(6);//将指定位置1
b.reset();//全部置0
b.reset(6);//指定位置0
//输出元素
cout<<b[i];//下标法输出,可以借用b.size()来控制个大规模输出
cout<<b;//注意输出的可是二进制形式哦(01串)
STL容器的常用用法的更多相关文章
- c++中stl容器的常用示例
1. set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的. 也就是说输入set容器后得到数据,会去重并排序. s.insert()插入一个元素 s.begin ...
- C++(二)— STL容器的基本用法
1.vector基本操作 关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后 ...
- C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法
每次忘记都去查,真难啊 /* C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法 */ /* vector常用用法 */ //头文件 #i ...
- STL容器set用法以及codeforces 685B
以前没怎么用过set,然后挂训练赛的时候发现set的妙用,结合网上用法一边学一边写. 首先set是一种容器,可以跟其他STL容器一样用 set<int > s 来定义, 它包含在STL头文 ...
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- C++ STL中的常用容器浅谈
STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...
- 深入解析C++ STL中的常用容器
转载:http://blog.csdn.net/u013443618/article/details/49964299 这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的 ...
- 刷题常用的STL容器总结
本文归纳总结刷题常用到STL容器以及一些标准算法,主要包括: string.vector.map.pair.unordered_map.set.queue.priority_queue.stack,以 ...
- 【pat】C++之刷题常用STL容器整理
1.vector 动态数组,方便的动态扩容,方便的变量初始化(int类型默认初始化为0,bool默认初始化为false),可以用来实现邻接表(结点数太多的图). 头文件 #include<vec ...
随机推荐
- 基于jQuery的表单操作
1,文本框的聚焦和失焦 在对文本框进行操作时,通常为了提升用户体验,是用户的操作得到及时的反馈,会在文本框获得焦点时,让其颜色改变,然后在失去焦点时恢复为原来的样式,一般情况下,我们可以通过css的伪 ...
- 正则捕获的细节及replace分析
1.var reg=/./与var reg=/\./的区别? 前者代表任意一个字符, 后者代表这个字符串中得有一个点 2.?的使用 如果单独的一个字符后面带? 代表1个或0个这个字符的出现: 列如: ...
- Jmeter接口压测
对于各个组件的使用,建议参考官方文档 1. Jmeter参数化,从txt文件读取. 1.txt
- windows,linux下SVN实现自动更新WEB目录
通过SVN进行版本库管理,每次提交后,都要在SVN服务器更新最新上传的版本到WEB目录进行同步.操作比较烦琐,而且效率也低.使用SVN钩子脚本进行WEB目录同步,可很好的解决这方面的问题.由于测试机器 ...
- php 数组函数实例
数组的概念 数组(array)是 PHP 中一个非常重要的概念,我们可以把数组看做一系列类似的数据的集合,实际上数组是一个有序图. PHP 还提供了超过 70 个内建函数来操作数组. 由于数组在php ...
- NFS各个版本之间的比较
NFS是一种网络文件系统,从1985年推出至今,共发布了3个版本:NFSv2.NFSv3.NFSv4,NFSv4包含两个次版本NFSv4.0和NFSv4.1.经过20多年发展,NFS发生了非常大的变化 ...
- ORM介绍(字段 和 字段的参数)
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Python序列化和反序列化vsJSON
# -*- coding: utf-8 -* """没有嵌套类的类 author: Jill usage: """ import json ...
- jmeter测试20个QPS下的响应时间-设置QPS限制
添加--->定时器--->Constant Throughput Timer Constant Throughput Timer 的主要属性介绍: 名称:定时器的名称 Target thr ...
- python之匿名函数和递归函数
递归函数 <1>什么是递归函数 通过前面的学习知道一个函数可以调用其他函数. 如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数. <2>递归函数的作用 ...