STL常用算法(持续更新)

一、遍历函数

1.for_each遍历函数

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

//for_each遍历函数

//普通函数
void pri(int val)
{
    cout << val << " ";
}

class myprint
{
public:
    void operator()(int val1)
    {
        cout << val1 << " ";
    }
};

int main(void)
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);

    for_each(v.begin(), v.end(), pri);

    cout <<endl<< "-----------------------------" << endl;

    for_each(v.begin(), v.end(), myprint());
    return 0;

}

 二.拷贝函数

1.copy


#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>


class myprint
{
public:
    
    void operator()(int val)
    {
        cout << val << " ";
    }
};
//copy算法功能:容器内指定范围的元素拷贝到另一容器

int main(void)
{
    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    vector<int> v2;
    v2.resize(v1.size());

    copy(v1.begin(), v1.end(), v2.begin());

    for_each(v2.begin(), v2.end(), myprint());

    return 0;
}

 三、集合算法

   求并集

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

void myprint(int val)
{
    cout << val << " ";
}
//集合合并set_union
int main(void)
{
    vector<int> v1;
    vector<int>v2;//要求并集的两个容器,且两个容器需要是有序的
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
        v2.push_back(i + 5);
    }
    vector<int>v3;//目标容器
    v3.resize(v1.size() + v2.size());// 放置并集前需要先分配大小
    vector<int>::iterator itend =     set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());//返回目标容器最后放置数的迭代器
    for_each(v3.begin(), itend, myprint);
    cout << endl;
    return 0;
}

 交集算法

 

 

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

//获得交集算法set_intersection

void myprint(int val)
{
    cout << val << " ";
}
int main(void)
{
    vector<int>v1;
    vector<int> v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
        v2.push_back(i + 5);
    }
    vector<int>v3;//目标容器需要提前开辟空间
    v3.resize(min(v1.size(), v2.size()));
    vector<int>::iterator itend = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    for_each(v3.begin(), itend, myprint);
    cout << endl;
    return 0;
}

 排列算法

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;

int main(void)
{
    int n, p[10];
    cin >> n;
    for (int i = 0; i < n; i++) cin >> p[i];
    sort(p, p + n);//先排序
    do
    {
        for (int i = 0; i < n; i++)printf("%d ", p[i]);
        cout << endl;
    } while (next_permutation(p, p + n));
    return 0;
}

 去重算法unique

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main(void)
{
    int N; cin >> N;
    int a[10000];
    for (int i = 0; i < N; i++) cin >> a[i];
    sort(a, a + N);
    int x = unique(a, a + N)-a;//去重算法,返回最后一个数的指针,需要先排序
    cout << x << endl;
    for (int i = 0; i < x; i++)cout << a[i] << " ";
    return 0;
}

 最大公约数算法 __gcd(注意前面的下划线是两个)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
int ans,x;
int main(void)
{
    for(int i = 1;i<=2020;i++)
    if(__gcd(i,2020) == 1)ans++;
    cout << ans;
    return 0;
} 

 计算一个数组内某个值的出现次数 count

#include<iostream>
#include<algorithm>
using namespace std;


int main(void)
{
    int maxi = -99999;
    int mini = 999999;
    string s;
    cin >> s;
    for(char ch = 'a';ch<='z';ch++)
    {
        int x = count(s.begin(),s.end(),ch);
        if(x == 0)continue;
        maxi = max(maxi,x);
        mini = min(mini,x);
    }
    cout << maxi-mini;
    return 0;
}

 

posted @ 2021-01-29 23:20  loliconsk  阅读(252)  评论(0)    收藏  举报