stringstream类
对于有些oj题目,可能未说明有多少个数组,只是一整行的数据。对于写,我们可以先把他们当做字符串直接读取,再利用stringstream类进行转化。
如下
#include<iostream>
#include<sstream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
int main(void){
string str = "123 456 1";//目标字符串
stringstream stream(str);//初始化
int x;
while(stream >> x){
cout << x << endl;
}
stream.clear();//清空状态,使其能再次使用
stream.str("147 258");//更改字符串
while(stream >> x){
cout << x << endl;
}
return 0;
}
关于next_permutation和prev_permutation函数
对于前者是返回比当前序列大的所有全排列,后者是返回比当前序列小的所有序列
使用方法如下:
#include<iostream>
#include<sstream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
int main(void){
string str = "0123";
while(next_permutation(str.begin(),str.end()))
cout << str << endl;
return 0;
}
注意是next_permutation返回比当前序列大的所有序列
perv_permutation的使用同理,也可用于数组等等。
对于multiset 删除相同元素中的一个,
先用查找找到对应的迭代器,然后直把这个迭代器删除
如下:
st.insert(1);
st.insert(1);
st.insert(2);
st.insert(3);
st.insert(5);
st.erase(st.lower_bound(1));
//这两种方法都可以
st.erase(st.find(1));
.lowerbound和.upper_bound的区别
前者返回与这个数相等的第一个数,如果这个数不存在,则返回比这个数大的第一个数。
后者返回比这个数大的第一个数,即使这个数存在,也是别这个数大的第一个数
如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
multiset<int> st;
multiset<int>::iterator it;
int main(void){
st.insert(1);
st.insert(1);
st.insert(2);
st.insert(3);
st.insert(5);
it = st.lower_bound(1);
it++;
cout << *it << endl;//结果仍是1,即第二个1.
it = st.upper_bound(1);
cout << *it << endl;//结果是2,
it = st.upper_bound(4);
cout << *it << endl;//结果是5,查询的数不存在
return 0;
}
不用额外申请内存的swap函数实现,对于char类型也可以用。
void swap(int &a,int &b){
a ^= b;
b ^= a;
a ^= b;
}
任意一个树再加入一条边都会形成圈。