STL的一些常用容器
2015-09-16 22:01
387 查看
set:内置平衡树。支持插入删除,动态求前驱后继,最大最小值,二分查找。不支持第k大和排名。
定义:
set<int> S;
set<int> iterator it; //迭代器
常用函数:
S.insert(50); 插入一个元素。自动去重。
S.lower_bound(50); 查找第一个大于等于50的数,返回迭代器,不存在返回end()
S.upper_bound(50); 查找第一个大于50的数,返回迭代器,不存在返回end()
S.erase(it); 删除迭代器指向的元素,一定要保证合法。
最小值S.begin(); 最大值S.rbegin(); 一定要保证存在,否则返回end()。
遍历方法:同vector,nlogn。
vector:向量,实际当不定数组用,功能比较强大,可以用之水过大视野上的普通平衡树一题。
普通平衡树为例:
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define prt(a) printf("%d\n", (a))
inline void get(int& r) {
char c, b=0; r=0;
do {c=getchar(); if (c=='-') b=1;} while(c<'0'||c>'9');
while (c>='0' && c<='9') {r = r*10+c-'0'; c=getchar();}
if (b) r=-r;
}
int N;
vector<int> a;
vector<int>::iterator p;
int main()
{
a.reserve(100001);
get(N);
int t, opt;
while (N--)
{
get(opt); get(t);
if (opt == 1)
a.insert(upper_bound(a.begin(), a.end(), t), t);//插入并保持有序
else if (opt == 2)
a.erase(lower_bound(a.begin(), a.end(), t));//删除并保持有序
else if (opt == 3)
prt(lower_bound(a.begin(), a.end(), t)-a.begin()+1);
else if (opt == 4)
prt(a[t-1]);
else if (opt == 5) {
p = lower_bound(a.begin(), a.end(), t);//前驱
prt(*(--p));
}
else prt(*upper_bound(a.begin(), a.end(), t));//后继
}
return 0;
}可以看出vector还是比较强大的。在不想写平衡树的时候可以简单替代。vector的插入和删除是O(n)的,但是内置有些优化,,所以比较快的。
定义:
set<int> S;
set<int> iterator it; //迭代器
常用函数:
S.insert(50); 插入一个元素。自动去重。
S.lower_bound(50); 查找第一个大于等于50的数,返回迭代器,不存在返回end()
S.upper_bound(50); 查找第一个大于50的数,返回迭代器,不存在返回end()
S.erase(it); 删除迭代器指向的元素,一定要保证合法。
最小值S.begin(); 最大值S.rbegin(); 一定要保证存在,否则返回end()。
遍历方法:同vector,nlogn。
vector:向量,实际当不定数组用,功能比较强大,可以用之水过大视野上的普通平衡树一题。
普通平衡树为例:
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define prt(a) printf("%d\n", (a))
inline void get(int& r) {
char c, b=0; r=0;
do {c=getchar(); if (c=='-') b=1;} while(c<'0'||c>'9');
while (c>='0' && c<='9') {r = r*10+c-'0'; c=getchar();}
if (b) r=-r;
}
int N;
vector<int> a;
vector<int>::iterator p;
int main()
{
a.reserve(100001);
get(N);
int t, opt;
while (N--)
{
get(opt); get(t);
if (opt == 1)
a.insert(upper_bound(a.begin(), a.end(), t), t);//插入并保持有序
else if (opt == 2)
a.erase(lower_bound(a.begin(), a.end(), t));//删除并保持有序
else if (opt == 3)
prt(lower_bound(a.begin(), a.end(), t)-a.begin()+1);
else if (opt == 4)
prt(a[t-1]);
else if (opt == 5) {
p = lower_bound(a.begin(), a.end(), t);//前驱
prt(*(--p));
}
else prt(*upper_bound(a.begin(), a.end(), t));//后继
}
return 0;
}可以看出vector还是比较强大的。在不想写平衡树的时候可以简单替代。vector的插入和删除是O(n)的,但是内置有些优化,,所以比较快的。
相关文章推荐
- 【python学习笔记】1.python环境搭建
- POJ 2377 Bad Cowtractors(kruskal最大生成树)
- 贪心入门
- Vim批量注释
- 一良心操盘手:我们是这样玩死散户的! z
- CSS实现多行文本溢出省略效果和单行文本溢出省略效果
- jquery文档加载几种写法,图片加载写法
- [Server] HP DL380 G6更新esxi6.0 SATA 硬盘掉线问题
- weiloser
- 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
- 负载应用
- UCOS中断函数的编写
- enumTips
- CentOS7上安装PostgreSQL
- shell 脚本之ping 命令同时打印时间
- poj 3614
- 论SetItemData和GetItemData
- 基础的排序
- Hbase shell 操作数据库常用命令
- linux-计划任务