std::multiset::erase(type val)
当指定元素的值的时候,删除所有为这个值的元素。因此若只想删除其中一个,应使用:std::multiset::erase(std::multiset::find(type val))
。int nend=unique(a+1,a+1+n)-a-1
。std::sort
一定要注意,定义仿函数或重载小于符号时 using namespace std
,其余名字空间不可暴露在全局中(即不声明)。使用 ::
来访问,比如 __gnu_pbds::priority_queue<int> Q
。<bits/extc++.h>
,会报错,原因和解决办法见这里。少使用 <bits/stdc++.h>
,不好用!原因是它不是 Dev 的浅层文件,写代码的时候找不到,只有编译的时候找得到。while(scanf("%d",&n)!=EOF)
或者 while(~scanf("%d",&n))
,会超时。只能用 while(cin>>n)
。实际上,Uva 的 scanf 好像就有问题/kk。-static
编译指令。<iostream>
在标准中没有规定要包含 <cstdio>
。为了保险,请在声明头文件的时候把两个都带上。<vector>
<cmath>
这两个头文件内的一些函数和类在 DevC++ 中不需要声明可以过编译。但是一定要把它们俩带上,因为似乎除了 DevC++ 的其他编译器都过不了。#include<bits/stdc++.h>
(内含 OI 通常能用到的所有头文件)而不是逐个写头文件,以免实际上漏了头文件但本地环境自动补齐。next
和 pipe
)-std=c++14
。如果这样不能编译(指的是编译器版本过低不支持 C++14 而不是你的程序编译错误!),就至少加上 -std=c++11
。`-Wall
,让编译器提醒一些常见错误,比如函数不写返回值。-fno-ms-extensions
(关闭一些和 msvc 保持一致的特性,例如,关闭后不标返回值类型的函数会报 CE 而不是默认为 int)。示例程序:
#include<bits/stdc++.h>
using namespace std;
namespace my_namespace{
int main(){
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
};
int main(){
return my_namespace::main();
}
编译选项:
g++ a.cpp -o a -std=c++14 -O2 -Wall -fno-ms-extensions
通常我们申请新空间使用 new
而清理内存使用 delete
。(还有一种使用类的方法,但我不记得了……)
但是!有时候 new
会增加不必要的程序占用空间,而据说这是内存碎片造成的。
当你的程序中 delete
可能用不到或者很少用的时候,也许开一个内存池更好(能够防止炸空间)。
比如:
class Node {
Node() {}
};
Node *nodes;
Node* newNode() {return new Node();}
可以替换成:
class Node {
Node() {}
};
const int MAXSIZE=1e6+6;
Node nodePool[MAXSIZE];
Node *poolPointer=nodePool;
Node* newNode() {return poolPointer++;}
这样就避免炸空间了。