参考资料:
可用来实现图论中的邻接表
#include
//方法一
vector<int> a; //创建空vector
//方法二
vector<int> a(10); //创建容量为10的vector
//方法三
vector<int> a(10, 1); //创建容量为10,每个元素初值为1的vector
a.size(); //返回a的大小
a.empty(); //判断a是否为空,是则为true,反之为false
a.clear(); //清空a
a.front(); //返回a中的第一个元素
a.back(); //返回a中的最后一个元素
a.push_back(x) //在a的尾部插入一个元素x
a.pop_back() //删除a的最后一个元素,返回值为void
此外,vector
还支持比较运算,比较方法为字典序比较。
for(int i=0;i<a.size();i++){
cout<<a[i]<<' ';
}
不是很常用
#include
//方法一
pair<int, int> p1(1, 2);
//方法二
pair<int, int> p2;
p2 = make_pair(1, 2);
p1.first; //第一个元素
p2.second; //第二个元素
#include
string s = "12345";
//substr()不会改变原字符串
s.substr(1, 3); //返回从下标为1的字符开始,长度为3的子串
s.substr(2); //返回从下标为2的字符开始,以最后一个字符为结尾的子串
s.push_back('0'); //尾插一个字符'0'
string s = "123";
string b = "hello";
s.insert(1, b, 0, 2); //将b中从下标为1的字符开始,长度为2的子串插入到s的下标为1的字符之前
//s = "1he23"
s.clear() //清空字符串
s.empty() //判断s是否为空字符串
s.size() //返回s的大小
#include
#include
queue<int> q;
stack<int> s;
//queue和stack共有的:
a.size();
a.empty();
a.push();
a.pop();
//stack
s.top(); //返回栈顶元素
//queue
q.front(); //返回队首元素
q.back(); //返回队尾元素
可以理解为二叉堆,很实用!
#include
//方法1
priority_queue<int> q; //默认为大根堆
//方法2:自定义比较函数
struct cmp{ //仿函数
bool operator()(int a, int b)const{ //重载“()”运算符
return a>b;
}
};
priority_queue<int, vector<int>, cmp>; //小根堆
//方法3:结构体优先队列
struct node{
int x, y;
bool operator<(const node& n)const{
return x>n.x;
}
};
priority_queue<node> q;
q.size();
q.empty();
q.push();
q.pop(); //弹出堆顶元素
q.top(); // 返回堆顶元素
#include
deque<int> dq;
dq.size();
dq.empty();
dq.clear();
dq.front();
dq.back();
dq.push_back(); //向最后插入一个元素
dq.pop_back(); //弹出最后一个元素
dq.push_front(); //向队首插入一个元素
dq.pop_front();//弹出第一个元素
类似数学中的集合
#include
set<int> s;
s.size();
s.empty();
s.clear();
s.insert();
s.find(); //没找到则返回s.end()
s.count();
s.erase(x);
s.erase(s.begin(),s.end());
需要支持C++11(没有C++11,用hash_map也行)
#include
unordered_map<string, double> t;
//插入
t["July"] = 7;
//判断键值是否存在。若存在,则:
t.count("July") != 0;
t.find("July") != t.end();
默认升序排序
//方法一
struct NODE{
int x, y;
bool operator<(const NODE& n)const{
if(x==n.x) y<n.y;
return x<n.x;
}
}node[maxn];
sort(node, node+maxn)
//方法二
struct NODE{
int x, y;
}node[maxn];
bool cmp(NODE a, NODE b){
if(a.x==b.x) a.y<b.y;
return a.x<b.x;
}
sort(node, node+maxn, cmp);
int a[10] = {1, 2, 2, 1, 3, 5, 5, 9, 9, 0};
int n = unique(a, a+10)-a; //n为去重后数组的长度
for(int i=0;i<n;i++) cout<<a[i]<<' '; //1,2,1,3,5,9,0
功能:返回指向第一个值不小于val
的位置(一般情况下需要保证数组有序)。
//形式一:
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);
//形式二:
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);
sort
+unique
+lower_bound
可以实现离散化,代码如下:
int a[7] = {12313987, 5723891, 471823956, 12313987, 75698634, 2141749, 471823956};
int b[7];
memcpy(b, a, sizeof(a));
sort(b, b+7);
int n = unique(b, b+7)-b;
for(int i=0;i<7;i++){
a[i] = lower_bound(b, b+n, a[i])-b;
cout<<a[i]<<' ';
}
//2 1 4 2 3 0 4
int n=35, m=45;
int k = __gcd(n, m);
cout<<k<<'\n'; //最大公约数
cout<<n/k*m; //最小公倍数
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);