【c++常用集合算法】

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

常用集合算法

【简介】:

  •     set_intersection; // 求两个容器的交集
  •     set_union; //求两个容器的并集
  •     set_difference; //求两个容器的差集

set_intersection

【功能】:

    求两个容器中元素的交集
复制代码

【函数原型】:

set_intersection(iterator begin1,iterator end1,iterator begin2, iterator end3,iterator dest);

    // 求两个集合的交集

    // **注意**:两个容器的元素必须是有序的

    // begin1 容器1的开始迭代器

    // end1 容器1的结束迭代器

    // begin2 容器2的开始迭代器

    // end2 容器2的结束迭代器

    // dest 目标容器的起始迭代器
复制代码

【demo】:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class MyPrint
{
public:
    void operator()(int v)
    {
        cout << v << " ";
    }
};

void test01()
{
    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }

    vector<int> v2;
    for (int i = 5; i < 15; i++)
    {

        v2.push_back(i);
    }

    // cout << "v1:";
    // for_each(v1.begin(), v1.end(), MyPrint());
    // cout << endl;

    // cout << "将交集的元素放在 v1中后:";
    // set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v1.begin());
    // for_each(v1.begin(), v1.end(), MyPrint());
    // cout << endl;

    vector<int> vTarget;
    // 取两个容器中较小容器的size(多余的空间赋予默认值0)
    vTarget.resize(min(v1.size(), v2.size()));
    vector<int>::iterator pos = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    // cout << *pos << endl; // 返回值是交集中最后一个元素的位置
    cout << "v1和v2的交集元素为:";
    for_each(vTarget.begin(), vTarget.end(), MyPrint());
    cout << endl;
}
int main()
{
    test01();
    return 0;
}
复制代码

小结

  •     求交集的两个集合必须是有序序列
  •     目标容器开辟空间,取两个容器中较小的容器的size
  •     set_intersetction 返回值是交集中最后一个元素的位置

set_union

【功能】:

    求两个容器中元素的并集
复制代码

【函数原型】:

set_union(iterator begin1,iterator end1,iterator begin2,iterator end2, iterator dest);

    // 求两个集合的并集

    // **注意**:两个容器的元素必须是有序的

    // begin1 容器1的开始迭代器

    // end1 容器1的结束迭代器

    // begin2 容器2的开始迭代器

    // end2 容器2的结束迭代器

    // dest 目标容器的起始迭代器
复制代码

【demo】:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class MyPrint
{
public:
    void operator()(int v)
    {
        cout << v << " ";
    }
};

void test01()
{
    vector<int> v1;
    for (int i = 0; i < 5; i++)
    {
        v1.push_back(i);
    }

    vector<int> v2;
    for (int i = 5; i < 10; i++)
    {

        v2.push_back(i);
    }

    vector<int> vTarget;
    // 目标容器开辟空间,取两个容器size之和
    vTarget.resize(v1.size() + v2.size());
    set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

    for_each(vTarget.begin(), vTarget.end(), MyPrint());
    cout << endl;
}
int main()
{
    test01();
    return 0;
}
复制代码

小结

  •     求并集的两个容器元素必须是有序的
  •     目标容器开辟空间,取两个容器size之和
  •     set_union 返回值是并集中最后一个元素的位置

set_difference

【功能】:

    求两个容器中元素的差集
复制代码

【函数原型】:

set_difference(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);

    // 求两个集合的差集

    // **注意**:两个容器的元素必须是有序的

    // begin1 容器1的开始迭代器

    // end1 容器1的结束迭代器

    // begin2 容器2的开始迭代器

    // end2 容器2的结束迭代器

    // dest 目标容器的起始迭代器
复制代码

【demo】:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class MyPrint
{
public:
    void operator()(int v)
    {
        cout << v << " ";
    }
};
void test01()
{
    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    vector<int> v2;
    for (int i = 5; i < 15; i++)
    {

        v2.push_back(i);
    }

    cout << "v1与v2的差集为:";
    vector<int> vTarget1;
    // 目标容器开辟空间,取较大容器的size
    vTarget1.resize(max(v1.size(), v2.size()));
    set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget1.begin());
    for_each(vTarget1.begin(), vTarget1.end(), MyPrint());
    cout << endl;

    cout << "v2与v1的差集为:";
    vector<int> vTarget2;
    // 目标容器开辟空间,取较大容器的size
    vTarget2.resize(max(v1.size(), v2.size()));
    set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget2.begin());
    for_each(vTarget2.begin(), vTarget2.end(), MyPrint());
    cout << endl;
}

int main()
{
    test01();
    return 0;
}
复制代码

小结

  •     求差集的两个集合必须是有序序列
  •     目标容器开辟空间,需要从两个容器中取较大容器的size
  •     set_difference返回值是差集中最后一个元素的位置

「欢迎在评论区讨论,掘金官方将在掘力星计划活动结束后,在评论区抽送100份掘金周边,抽奖详情见活动文章」。

猜你喜欢

转载自juejin.im/post/7017385523417186317