from:why

很多很多part……

1.pair:

相当于把两个变量放在一起:

#include<utility>

using namespace std;

pair<TypeName1,TypeName2> VariableName;

pair<int,int> x;

pair<double,double> y;

pair<int,double> z;

pair< pair<int,int> ,int> a;

优点:好写

作为需要返回多个量的函数返回值

作为struct的代替:

默认按照第一元素来进行比较排序

Pair 的比较大小:先比较第一个元素,第一个元素相同时再比较第二个元素。

如果两个元素都相等则判定相等。

2.string:

#include<string>

using namespace std;

string a;//现在是空串

a = b, a = ``Hello World'':支持赋值

a[i];:支持下标访问

a.size():字符串长度

a+b:支持字符串拼接

a:qingbei   b:xuetang

a+b=qingbeixuetang

a>b:支持按字典序排序

a.substr(x,y):从x位置开始,长度为y的子串  返回左闭右开???

3.vector:

problem 1:

有编号为 1 到 3000 × 3000 的人,每个人都属于一个队伍。一共有3000 个队伍,每个队伍 3000 人。如何存储这些数据?

显然用数组储存就好了qwq:

const int maxN = ;
int team[maxN][maxN];

problem 2:

有编号为 1 到 3000 × 3000 的人,每个人都属于一个队伍。一共有3000 个队伍,每个队伍可能有任意多数人,也可能没有人。如何存储这些数据?

这个时候显然用数组存的话有点浪费,毕竟我们不能确定每队有多少人。这个时候,something amazing就出现了:

vector:

不定长数组:不需要指定数组元素的数量,可以直接通过元素

的个数分配内存

#include <vector>
using namespace std; vector<TypeName> VariableName;
vector<int> a;
vector<double> b;
vector<vector<int> > c;

内存分配:内存(也就相当于数组的大小)总是2n,加入操作时先开一个空间,接着开2个,然后开成4个……接着8个;

a[0]: 随机下标访问, O(1).

a.push_back(): 在末尾插入一个元素, O(1).

a.pop_back(): 弹出末尾元, O(1).

a.front(): 访问第一个元素(引用) , O(1).

a.back(): 访问最后一个元素, O(1).

a.clear(): 清空一个 Vector, O(n).

a.empty(): 返回 Vector 是否为空, O(1).

a.size(): 返回 Vector 中元素的个数, O(1)

eg:

接受n个整数的输入,倒序输出;

#include <iostream>
using namespace std;
int main() {
vector<int> a;
int n, x;
cin >> n;
for (int i = ; i < n; ++i) {
cin >> x;
a.push_back(x);
}
while (!a.empty()) {
cout << a.back();
a.pop_back();
}
return ;
}

vector实现比数组慢(开o2的话和数组的实现速度差不多,不开o2可能会炸)

Vector迭代器:(vector的内存是连续的)

vector<int>::iterator it;

迭代器 (iterator) 的作用类似于指针,是一个指明元素位置的量。什么类型的 Vector就要用什么类型的迭代器。
 a.begin(): 返回第一个元素的迭代器
 a.end(): 返回最后一个元素的后一个迭代器
 *a.begin(): 等价于 a.front()
 *it: 得到 it 指向的值
 it++: 得到下一个位置的迭代器

 it += i: 得到下 i 个位置的迭代器, O(1)
 it1 - it2: 得到 it1 与 it2 之间的元素个数, O(1)

vector<int>::iterator it;
for (it = a.begin(); it != a.end(); ++it) {
cout << *it << endl;
}

相当于指针(返回的是位置)

加*是返回指针的值

支持自增运算,可以得到下一个位置的迭代器

一些神奇的东西(c++11中才有,c++98没有):anto

遍历a的每一个anto类型x:这个anto的类型是系统自己判断的

4.set

set是一个集合

集合:不能有重复元素+有序的(数学:我没要求有序啊)

具有鲁棒性:

举个栗子:

删除的如果是一个不存在的数也不会报错

#include<set>
using namespace std; set<TypeName> VariableName;
set<int> a;
set<double> b;

操作:

a.clear(): 清空元素

a.empty(): 检查是否为空

a.size(): 查看 set 内元素个数

a.begin(): 第一个元素的迭代器

a.end(): 最后一个元素的后一个迭代器

a.insert(): 插入一个元素, O(log n)

a.erase(): 删除一个元素, O(log n)

a.find(): 寻找一个元素, O(log n)

a.count(): 查找某个元素的数量, O(log n)

a.lower_bound(): 查找大于等于某个值的第一个元素, O(log n)

a.upper_bound(): 查找大于某个值的第一个元素, O(log n)

a.equal_range(): 查找等于某个值的左闭右开区间,返回一个pair, O(log n)

#include <set>
#include <iostream>
using namespace std;
int main() {
set<int> a;
a.insert(); // a: {1}
a.insert(); // a: {1}
a.insert(); // a: {1, 2}
a.erase(); // a: {2}
for (int i = ; i < ; ++i) {
a.insert(i);
} // a: {0, 1, 2, 3, 4}
cout << a.size() << endl; //
cout << a.count() << endl; //
}

set的迭代器:

Set 的迭代器和 Vector 的不同。(set的储存是无序的)

set<int>::iterator it; 

*it: it 的求值

++it: it 的下一个迭代器

--it: it 的前一个迭代器

不能跳着访问第n个迭代器,只能向前或向后访问一个迭代器
 Vector: 随机访问迭代器(可以访问任意迭代器)
 Set: 双向迭代器(只能向前或向后访问一个迭代器)

寻找:返回的是迭代器,如果没有返回a.end()

不能一次访问某个迭代器后的n个(因为它的内存不是连续的)

我也不知道这是写来干嘛的,总之是一个按照成绩排名的简单的神奇的东西:

可以这么写(利用重载运算符把成绩小的放在前面):

还可以这样写(把重载作为成员函数):

little 拓展:

替罪羊:打平(保证前序遍历不变,重新建一棵平衡的树)

(问题在于怎么设计?设计什么?)

Splay,treap

5.MultiSet:

和set差不多,只不过MultiSet允许存在重复的元素:

#include <set>
using namespace std;
multiset<TypeName> VariableName;
multiset<int> s;

multiset 和 set 大部分操作相同,但支持在一个 set 内有多个元素。
注意在 multiset 中,如果 erase 一个数,仍然会把全部的数字删除。

erase删除时会删除所有的某个数,如果想要只删除一个有重的数字的话,需要删除它的迭代器;

6.Map 

引例:

给出许多学生的名字和成绩,要求使用名字找到成绩。

比如学生 __debug 的微积分 59 分,我们希望能通过 __debug 找到 59.

a['__debug'] = 59 ?

楼上的数组显然——做不到;

所以有一个神奇的东西可以做到——map;

#include <map>
using namespace std;
map<TypeName1, TypeName2> VariableName;
map<string, int> a;

map要保证第一维也就是TypeName1需要是可以排序的(map是有序的根据???)

举一坨栗子:

map其实是set的一种比较神奇的形式:

上下等价;

这就是一个map

map 的本质就是一个元素为 pair 的 set,重载了 [] 运算符。

7.stack:

#include <stack>
using namespace std;
stack<TypeName> VariableName;
stack<int> a;
//一个“先进后出”结构。

8.queue

#include <queue>
using namespace std;
queue<TypeName> VariableName;
queue<int> a;
//一个“先进先出”结构。

9.priority_queue:

#include <queue>
using namespace std;
priority_queue<TypeName> VariableName;
priority_queue<int> a;

一个类似队列的结构。不同的是,队列每次出最先进队的元素,优先队列每次出最大的元素。

类似 Set,需要重载 < 运算符。

是一个大根堆,如果定义int型并且要建小根堆:

大根堆:

还可以用cmp:

比较大小的话,cmp(1,2),显然它很像一个函数,但是c++不接受函数型,所以要改成一种类型opp会用到qwq

比set要慢,set和map比较快,开o2的话map可以跑得像o(1)一样;

10.algorithm:

(1)sort:O(nlogn)

#include <algorithm>
using namespace std;
int a[];
vector<int> b;
int main() {
sort(a, a + );
sort(b.begin(), b.end());
}
可以是指针或迭代器;

(2)Reverse:O(n)

#include <algorithm>
using namespace std;
int a[];
vector<int> b;
int main() {
reverse(a, a + );
reverse(b.begin(), b.end());
}

和sort用法相反?

(3)unique去重:unique复杂度o(n)

应用的时候必须排好序,p指向的是去重过后的数组的后一个位置;

(4)fill:赋值:

把一段全都赋值成某个数:语法见下:

(5)Next Permutation:O(n!)

求排列,如果没有排列方式了,返回1;

函数是返回是否是最后一个排列

可以用来求全排列:

(6)Binary Search:写好的二分

从a.begin();开始

(7)Nth Element

随机重拍里面的元素

实现随机排列的方式

rand:

rand是个假随机,它有一个随机种子,srand改变他的种子,为了随机,用时间点来当种子srand(time(0))

【五一qbxt】day6 OI中的stl的更多相关文章

  1. GCC&&GDB在OI中的介绍

    序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...

  2. 浅谈OI中的底层优化!

    众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ...

  3. DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]

    最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况.这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中 ...

  4. 浅谈分治算法在OI中的应用

    分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述]   为了奖励牛牛同学帮妈妈解决了大写中 ...

  5. ubuntu下安装pthread的manpages(man 手册) 在Ubuntu中查看STL帮助

    http://blog.csdn.net/leisure512/article/details/4881391 由于学习多线程编程,所以用到pthread,但是man的时候却发现没有pthread函数 ...

  6. 不要在公共接口中传递STL容器

    最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...

  7. DLL中传递STL参数,vector对象作为dll参数传递等问题(转)

    STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下 ...

  8. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  9. OI中常犯的傻逼错误总结

    OI中常犯的傻逼错误总结 问题 解决方案 文件名出错,包括文件夹,程序文件名,输入输出文件名  复制pdf的名字  没有去掉调试信息  调试时在后面加个显眼的标记  数组开小,超过定义大小,maxn/ ...

随机推荐

  1. WPF绑定各种数据源之xml数据源

    一.WPF绑定各种数据源索引 WPF 绑定各种数据源之Datatable WPF绑定各种数据源之object数据源 WPF绑定各种数据源之xml数据源 WPF绑定各种数据源之元素控件属性 Bindin ...

  2. Python + logging输出到屏幕,将log日志写入到文件

    logging提供了一组便利的函数,用来做简单的日志.它们是 debug(). info(). warning(). error() 和 critical(). logging函数根据它们用来跟踪的事 ...

  3. 详解webpack4打包--新手入门(填坑)

    注意,这个dev和build好像在哪儿见过??对了, 刚刚才在package.json里配置的“scripts”这一项的值就有“dev”和“build”.对,一点都不错,就是这2个值,这2个值代表的是 ...

  4. [Luogu2014]选课(树形dp)

    [Luogu2014]选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课 ...

  5. [CSS]CSS中使用span和div遇到的问题

    一. span和div的区别 1.span是行级元素,div是块级元素2.span占用的宽度是内容的宽度,而div默认是一行.所以一般在页面中,只有一行或不到一行文字用span,元素占据多行时用div ...

  6. python数据库操作-mysql数据库

    一:连接 1:本地连接 mysql -u用户名 -p密码 2:连接远程服务器 mysql -u用户名 -p密码 -hip地址 -P端口号     线下修改远程服务端上部署的mysql服务器 二:创建数 ...

  7. centos 6.5 安装 nginx

    从nginx官网下载安装包:nginx-1.8.1.tar.gz,解压 tar xvf nginx-1.8.1.tar.gz -C /usr/local 安装依赖 yum install gcc yu ...

  8. HTML基础—DOM操作

    DOM(Document Object Model文档对象模型) 一个web页面大的展示,是由html标签组合成的一个页面,dom对象实际就是将html标签转换成了一个文档对象.可以通过dom对象中j ...

  9. win8安装maven

    1.下载并解压maven F:\maven\apache-maven-3.5.2 2. 设置环境变量 3. Path路径中添加maven的可执行文件目录(bin目录) 4.验证maven是否安装成功: ...

  10. linux运维、架构之路-Nginx反向代理

    一. Nginx负载均衡和反向代理知识 1.集群概念   一堆服务器合作做同一件事,这些机器可能需要整个技术团队架构.设计和统一协调管理,这些机器可以分布在一个机房,也可以分布在全国各个地区的多个机房 ...