关于C++中STL的一些东西和一些函数小技巧(不定期整理)

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;
}

任意一个树再加入一条边都会形成圈。

扫描二维码关注公众号,回复: 2295759 查看本文章

猜你喜欢

转载自blog.csdn.net/zhao5502169/article/details/78752236